Tôi hiện đang làm việc để cải thiện tính bảo mật của trang web Drupal 8 bằng cách triển khai Chính sách bảo mật nội dung. Vì điều này vẫn còn mới đối với tôi nên tôi muốn nhận được một số thông tin đầu vào về chiến lược của mình.
Thiết lập cơ sở có liên quan
Những cân nhắc sơ bộ
Tôi muốn không sử dụng 'nội tuyến không an toàn'
cho các tập lệnh nếu có thể, nhưng cuối cùng tôi nhận ra rằng điều này sẽ chỉ hoạt động đối với một số trình duyệt nhất định.
Tôi cũng muốn có một CSP phù hợp cho các tình huống khác nhau (các trình duyệt khác nhau, đã đăng nhập và chưa đăng nhập).
Điều này dẫn tôi đến ý tưởng này cho tập lệnh-src
:
- sử dụng
nonce
và 'nghiêm ngặt-năng động'
cho các trình duyệt hỗ trợ CSP v3 và các trang không thể lưu vào bộ đệm
- sử dụng hàm băm cho các trình duyệt hỗ trợ CSP v3 và các trang có thể lưu vào bộ nhớ đệm
- sử dụng
'nội tuyến không an toàn'
cùng với danh sách dựa trên tên miền cho tất cả các trình duyệt khác
Lý do chính để có sự khác biệt về trình duyệt là tôi không thể tìm ra cách tạo các chỉ thị CSP tương thích ngược mà không có số lượng thay đổi bất hợp lý đối với các mô-đun lõi và đóng góp.
Những gì tôi đã làm cho đến nay trên trang web thử nghiệm địa phương của tôi
Tôi đã thêm logic sử dụng một nonce
và 'nghiêm ngặt-năng động'
đối với các trình duyệt dựa trên chrome dành cho người dùng đã đăng nhập, những trang không được lưu trong bộ nhớ cache, đảm bảo rằng các nonce là mới và duy nhất cho mọi yêu cầu. Logic đó dựa trên chuỗi Tác nhân người dùng (mà tôi biết là không an toàn, nhưng không thấy giải pháp nào tốt hơn).
Vì vậy, về cơ bản, đối với trình duyệt dựa trên chrome, người dùng đã đăng nhập sẽ nhận được tiêu đề CSP với các chính sách CSP liên quan đến tập lệnh đó ('nội tuyến không an toàn'
trong script-src sẽ bị các trình duyệt hỗ trợ bỏ qua 'nghiêm khắc năng động'
):
script-src 'self' 'unsafe-inline' *.googletagmanager.com *.google-analytics.com 'noce-SECURENONCE' 'strict-dynamic';
script-src-attr 'không an toàn trong dòng';
Người dùng ẩn danh sẽ nhận được một CSP trông giống như sau:
script-src 'self' 'unsafe-inline' *.googletagmanager.com *.google-analytics.com 'sha256-HASH_1' 'sha256-HASH_2' 'sha256-HASH_3' 'sha256-HASH_4' 'sha256-HASH_5' .. .;
script-src-attr 'không an toàn trong dòng';
Các trình duyệt không dựa trên chrome có tiêu đề CSP giống như sau:
script-src 'self' 'unsafe-inline' *.google-analytics.com *.googletagmanager.com;
Tôi cũng đã thêm logic, dựa trên các tiêu chí lựa chọn ở trên, thêm một trong hai nonce
các thuộc tính cho mọi thẻ tập lệnh (các trang không được lưu trong bộ nhớ cache) hoặc mã băm cho mọi thẻ tập lệnh (các trang được lưu trong bộ nhớ cache). Điều này cũng cho phép tôi có CKEditor hoạt động tốt trong phần phụ trợ.
Có vẻ như nó hoạt động tốt trên các trình duyệt khác nhau mà tôi đã thử nghiệm: Brave, Chrome, Edge, Firefox và Safari. Chỉ ba người trước đây có CSP mà tôi cho là an toàn (cũng được kiểm tra bằng https://csp-evaluator.withgoogle.com/).
Đây có phải là một cách tiếp cận hợp lệ để có:
- các CSP khác nhau cho người dùng đã đăng nhập và người dùng ẩn danh?
- các CSP khác nhau cho các trình duyệt khác nhau (hoặc thực tế là các "trình duyệt được báo cáo" khác nhau)?