Viết tắt là CSP, là một cơ chế bảo mật giúp ngăn ngừa XSS attack. CSP hoạt động bằng cách chỉ định một số domain tin cậy mà browser có thể tải code JS về và thực thi. Tất cả các code JS đến từ các nguồn khác (bao gồm cả inline script) đều sẽ bị bỏ qua.

Ngoài code JS, CSP còn có thể restrict các loại tài nguyên khác chẳng hạn như CSS, video, audio, …

Policy Directives

Để enable CSP, web server cần trả về một header có key là Content-Security-Policy với giá trị là các policy directive nhằm giúp browser biết được các nguồn tin cậy mà browser có thể tải và thực thi các loại tài nguyên.

Một số policy directive phổ biến:

  • default-src: fallback policy cho tất cả các loại tài nguyên khi chúng không có các policy cụ thể.
  • script-src: ngăn ngừa inline script và hàm eval() được thực thi.
  • style-src: ngăn ngừa việc tải và thực thi các file CSS từ các nguồn không tin cậy.

Chúng ta cũng có thể cấu hình CSP ở trong thẻ <meta> như sau:

<meta
  http-equiv="Content-Security-Policy"
  content="default-src 'self'; img-src https://*; child-src 'none';" />

CSP còn có hai cách để chỉ định nguồn tài nguyên tin cậy:

  • Tag cần load script phải có một giá trị nonce khớp với giá trị nonce được chỉ định bởi CSP directive. Nonce sẽ được tạo lại mỗi lần tải trang và không thể dự đoán được.
  • Directive chỉ định giá trị băm của script tin cậy. Nếu giá trị băm của script thực tế khác với giá trị được chỉ định thì script sẽ không được thực thi. Nếu nội dung của script bị thay đổi thì ta cần cập nhật giá trị băm ở trong directive.

Examples

  1. Cho phép tải và thực thi tất cả nội dung từ domain của trang web (không bao gồm các subdomain):

    Content-Security-Policy: default-src 'self'
    
  2. Cho phép tải và thực thi tất cả nội dung từ domain của trang web, một trusted domain và các subdomain của trusted domain đó:

    Content-Security-Policy: default-src 'self' example.com *.example.com
    
  3. Cho phép load ảnh từ mọi nguồn, media và script từ một số trusted domain:

    Content-Security-Policy: default-src 'self'; img-src *; media-src example.org example.net; script-src userscripts.example.com
    
  4. Sử dụng nonce:

    Content-Security-Policy: script-src 'nonce-random_nonce_value'
    
  5. Sử dụng hash:

    Content-Security-Policy: script-src 'sha256-abcdef1234567890'
    
list
from [[Content Security Policy]]
sort file.ctime asc

Resources