CSP và cách CSP ngăn chặn tấn công XSS

0
45
Rate this post

CSP (Content-Security-Policy) – hay còn được gọi là tiêu đề Content Security Policy – đang trở nên ngày càng phổ biến. Trong bài viết này, chúng ta sẽ tìm hiểu về CSP và cách nó ngăn chặn tấn công XSS.

1. CSP là gì?

CSP (Content Security Policy) là một tầng bảo mật được thêm vào để phát hiện và ngăn chặn một số kiểu tấn công phổ biến, bao gồm cả tấn công XSS (Cross Site Scripting) và tấn công data injection. CSP hoạt động dựa trên một danh sách an toàn (whitelist) gồm các domain, script, style, hình ảnh, frame mà trình duyệt được phép tải trên trang web của chúng ta. Điều này đảm bảo chỉ có những script, style, hình ảnh, frame được chúng ta chỉ định mới được tải, các yêu cầu không nằm trong whitelist sẽ bị chặn ngay lập tức.

Mặc dù không phải tất cả các trình duyệt đều hỗ trợ CSP, nhưng trình duyệt không hỗ trợ CSP vẫn có thể hoạt động bình thường trên các máy chủ triển khai CSP. Vì vậy, chúng ta không phải lo lắng về việc trình duyệt không hỗ trợ CSP sẽ gặp sự cố.

2. Cách hoạt động của CSP

CSP (hoặc Content-Security-Policy) thực chất là một tiêu đề (header) được gắn vào yêu cầu (request) khi gửi đến server. Để sử dụng CSP, chúng ta chỉ cần cấu hình server trả về tiêu đề Content-Security-Policy trong các yêu cầu.

Một cách khác để sử dụng CSP là thông qua thẻ <meta>. Ví dụ: <meta http-equiv="Content-Security-Policy" content="default-src 'self'; img-src https://*; child-src 'none';">

3. Ví dụ về thẻ meta

a. Các directive CSP:

  • default-src: chỉ rõ nguồn mặc định khi không có directive khác
  • script-src: chỉ rõ nguồn để tải các tài nguyên JavaScript
  • style-src: chỉ rõ nguồn để tải các tài nguyên CSS
  • image-src: chỉ rõ nguồn để tải các tài nguyên hình ảnh
  • font-src: chỉ rõ nguồn để tải các tài nguyên phông chữ
  • frame-src: chỉ rõ nguồn để tải các tài nguyên frame

b. Các giá trị của directive CSP:

  • *: đại diện cho tất cả các nguồn (wildcard)
  • self: chỉ cho phép tài nguyên từ domain hiện tại
  • none: không cho phép bất kỳ nguồn nào
  • http://www.domain.com: cho phép tải tài nguyên từ domain được chỉ định (khác hoàn toàn với domain.com)
  • domain.com: chỉ cho phép tải tài nguyên từ domain được chỉ định, không cho phép từ http://www.domain.com, subdomain.domain.com, cdn.domain.com, …
  • *.domain.com: cho phép tải tài nguyên từ tất cả các subdomain của domain domain.com
  • https: cho phép tải từ các trang HTTPS

c. Ví dụ:

  • Content-Security-Policy: default-src 'self': Chỉ cho phép tải tài nguyên từ domain hiện tại hoặc domain đang truy cập.
  • Content-Security-Policy: default-src 'self' *.pavietnam.vn: Cho phép tải tài nguyên từ domain hiện tại và các subdomain của domain pavietnam.vn.
  • Content-Security-Policy: default-src 'self'; img-src *; media-src abc1.com abc2.com; script-src userscripts.com: Cho phép tải tài nguyên từ domain hiện tại (default-src 'self'), tải hình ảnh từ bất kỳ nguồn nào (img-src *), tải media từ abc1.com và abc2.com (media-src abc1.com abc2.com), và tải script từ userscripts.com (script-src userscripts.com).

4. Theo dõi vi phạm CSP

a. Đặt thẻ report-uri

Bằng cách thêm thuộc tính report-uri vào tiêu đề Content-Security-Policy và chỉ định URI nhận báo cáo, trình duyệt sẽ tự động gửi một yêu cầu POST đến địa chỉ đó, kèm theo nội dung chi tiết về cuộc tấn công.

Ví dụ:

Content-Security-Policy: default-src 'none'; style-src dreamknight.click; report-uri http://dreamknight.click/collector.cgi

Nếu vi phạm chỉ định về style (style-src dreamknight.click), trình duyệt sẽ gửi một yêu cầu POST đến: report-uri http://dreamknight.click/collector.cgi.

b. Sử dụng công cụ từ https://report-uri.com

Một tính năng rất hữu ích của CSP là Report URI, giúp chúng ta nhận báo cáo về vi phạm CSP trực tiếp trên trang web của mình, từ đó biết được dạng tấn công nào đang nhắm vào. Chúng ta có thể kiểm tra mức độ bảo mật của CSP hoặc cấp phép cho các domain an toàn mà chưa được thêm vào whitelist dựa trên những báo cáo này.

Cách sử dụng khá đơn giản, mỗi khi có vi phạm CSP trên trang web, trình duyệt sẽ gửi thông tin về vi phạm đó đến một dịch vụ đã thiết lập sẵn để chúng ta có thể theo dõi. Một trong những dịch vụ miễn phí hỗ trợ việc này là https://report-uri.com. Đây là phiên bản miễn phí và có giới hạn 10,000 báo cáo/tháng.

Sau khi đăng nhập vào trang quản trị của Report URI, bạn có thể tạo một subdomain theo ý thích và sử dụng nó để xác định với các trang khác.

CSP

Khi đã tạo subdomain, bạn chỉ cần chèn đường dẫn này vào cấu hình CSP theo cú pháp:

report-uri https://hiepnguyen.report-uri.com/r/d/csp/reportOnly

Và cấu hình Report URI cho CSP trong trang WordPress sẽ trở thành:

function header_csp_generate(){
    header("Content-Security-Policy: default-src 'self'; script-src 'self' 'unsafe-inline' www.googletagmanager.com www.google-analytics.com tagmanager.google.com; style-src 'self' 'unsafe-inline' tagmanager.google.com; img-src 'self' data: www.googletagmanager.com www.google-analytics.com www.google.com www.google.com.vn i.ytimg.com https://*.gravatar.com https://images.dmca.com; frame-src www.googletagmanager.com www.google.com www.youtube.com; font-src 'self'; connect-src 'self' *.google.com google.com google.com.vn www.google-analytics.com; object-src 'none'; report-uri https://hiepnguyen.report-uri.com/r/d/csp/reportOnly");
}
add_filter('wp_head', 'header_csp_generate');

Dưới đây là bài viết về CSP và cách CSP ngăn chặn tấn công XSS để bạn có thể hiểu rõ hơn.

Chúng tôi là Dnulib, chuyên cung cấp dịch vụ thiết kế website chuyên nghiệp và đáng tin cậy. Chúng tôi cam kết tuân thủ nguyên tắc E-A-T (Expertise, Authoritativeness, Trustworthiness, Experience) để đảm bảo sự chuyên môn, uy tín và kinh nghiệm của chúng tôi trong lĩnh vực này.