You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

csp-apache.conf.md 3.1 KiB

​
​
​
пре 3 месеци
​
пре 2 месеци
​
пре 3 недеља
​
пре 1 месец
пре 1 месец
​
пре 2 месеци
​
​
​
​
​
​
​
​
пре 3 месеци
​
​
пре 2 месеци
пре 3 месеци
​
​
​
​
​
​
​
​
​
​
​
​
​
​
пре 3 месеци
​
​
пре 2 месеци
пре 3 месеци
​
​
​
​
​
​
​
пре 3 месеци
пре 2 месеци
пре 3 месеци
пре 3 месеци
​
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. # Content-Security-Policy (Apache)
  2. Self-hosted fonts: no `fonts.googleapis.com` or `fonts.gstatic.com`. Static assets (including `woff2`) are served from `'self'`.
  3. Adjust `report-uri` if your API base path or host differs (UAT example below; PROD uses `https://pnsps.gld.gov.hk/api/csp-report`).
  4. See also:
  5. - [spa-apache-routing-follow-up.md](./spa-apache-routing-follow-up.md) — SPA deep links (`/paymentPage/callback`, etc.) and Apache reverse-proxy setup
  6. - [csp-api-logout-404-follow-up.md](./csp-api-logout-404-follow-up.md) — keep `/api/*` off SPA `index.html` fallback
  7. - [permissions-policy-apache.conf.md](./permissions-policy-apache.conf.md) — Permissions-Policy reporting via the same `/api/csp-report` URL
  8. - [csp-report-review-2026-09-22.md](./csp-report-review-2026-09-22.md) — latest PROD report review (`All_CSP.txt`)
  9. - [csp-report-review-2026-08-14.md](./csp-report-review-2026-08-14.md) — earlier PROD + UAT report review and add/remove summary
  10. - [csp-report-review-2026-08-03.md](./csp-report-review-2026-08-03.md) — earlier PROD report analysis that drove `frame-src` / `media-src` updates
  11. ## Enforcing
  12. ```apache
  13. Header always set Content-Security-Policy "default-src 'self'; \
  14. base-uri 'self'; \
  15. object-src 'none'; \
  16. frame-ancestors 'none'; \
  17. form-action 'self'; \
  18. frame-src 'self' data: blob:; \
  19. script-src 'self'; \
  20. style-src 'self' 'unsafe-inline'; \
  21. style-src-elem 'self' 'unsafe-inline'; \
  22. img-src 'self' data:; \
  23. media-src 'self' blob: data:; \
  24. font-src 'self' data:; \
  25. connect-src 'self'; \
  26. upgrade-insecure-requests"
  27. ```
  28. ## Report-Only
  29. Same policy plus violation reporting:
  30. ```apache
  31. Header always set Content-Security-Policy-Report-Only "default-src 'self'; \
  32. base-uri 'self'; \
  33. object-src 'none'; \
  34. frame-ancestors 'none'; \
  35. form-action 'self'; \
  36. frame-src 'self' data: blob:; \
  37. script-src 'self'; \
  38. style-src 'self' 'unsafe-inline'; \
  39. style-src-elem 'self' 'unsafe-inline'; \
  40. img-src 'self' data:; \
  41. media-src 'self' blob: data:; \
  42. font-src 'self' data:; \
  43. connect-src 'self'; \
  44. upgrade-insecure-requests; \
  45. report-uri https://pnspsuat.gld.gov.hk/api/csp-report"
  46. ```
  47. ## Notes
  48. - **`frame-src`**: Required for proof file preview iframes that use `data:` / `blob:` URLs (`UploadFileTable.js`). Without this, framing falls back to `default-src 'self'` and browsers report `frame-src` violations (often with empty `blocked-uri`).
  49. - **`style-src-elem`**: Explicit, alongside `style-src`, for `<link rel="stylesheet">` behaviour in modern browsers.
  50. - **`img-src`**: `'self' data:` is enough. The WCAG 2 AA badge is bundled locally (`src/assets/images/wcag2AA.png`) and no longer loaded from `www.w3.org`.
  51. - **`media-src`**: `blob:` for captcha audio object URLs; `data:` for data-URI media if used.
  52. - **`font-src`**: `'self' data:` covers bundled fonts and `data:` URLs if used.
  53. - **Report noise**: Browser extensions (Kaspersky, Perplexity, Youdao, Quark, Google Fonts injected by tooling, `wasm-eval` from chrome-extension) will still appear under Report-Only. Do **not** allowlist those origins.
  54. - Add origins to the relevant directive only if you introduce third-party scripts, styles, fonts, or APIs that the **application** itself loads.