Điểm:1

Đây có phải là một cách tiếp cận hợp lệ để có một CSP khác dựa trên trạng thái đăng nhập và trình duyệt không?

lá cờ bd

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

  • Drupal 8, với một bản vá tùy chỉnh giúp ckeditor.js chuyển nonces khi tải plugin của nó, CKEditor chỉ được sử dụng bởi người dùng đã đăng nhập
  • Bộ bảo mật, được vá để cung cấp móc nối thay đổi cho chỉ thị CSP (https://www.drupal.org/project/seckit/issues/2844205#comment-14217383).
  • Mã tùy chỉnh để thực hiện các sửa đổi đối với HTML được kết xuất và cấu hình CSP từ mô-đun Bộ công cụ bảo mật

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'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'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ó:

  1. các CSP khác nhau cho người dùng đã đăng nhập và người dùng ẩn danh?
  2. 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)?
lá cờ cn
Có vẻ như các câu hỏi chính của bạn sẽ áp dụng cho bất kỳ trang web nào chứ không phải trang Drupal nói riêng? Xin lỗi nếu tôi sai ở đó. Tuy nhiên, nếu họ muốn, điều này có thể phù hợp hơn với (và quan trọng hơn là nhận được câu trả lời tốt hơn)
berliner avatar
lá cờ bd
@Clive Bạn có thể đúng. Mặc dù vậy, tôi đã hy vọng rằng CSP có thể là một chủ đề dành cho những người sử dụng Drupal nói chung và tôi cũng hy vọng rằng ai đó có thể xác nhận hoặc phản đối cách tiếp cận của tôi trong bối cảnh cụ thể của Drupal.
Điểm:3
lá cờ th
  1. Dựa vào tác nhân người dùng là không đáng tin cậy - ví dụ: tôi đã thay đổi tác nhân người dùng trong trình duyệt cũ của mình, nếu không YouTube sẽ từ chối hoạt động. Nếu, dựa trên kết quả phân tích các báo cáo vi phạm, bạn thay đổi CSP cho tác nhân người dùng đó của tôi, những người dùng hợp pháp của trình duyệt này có thể bị ảnh hưởng.

  2. sử dụng của script-src-attr 'không an toàn trong dòng'; sẽ mở ra cơ hội cho XSS trong các trình duyệt dựa trên Chromium, vì nó cho phép các trình xử lý sự kiện trong các thẻ (như onckick="cảnh báo('XSS')").

  3. sử dụng của 'sha256-HASH'không phải hỗ trợ cho bên ngoài tập lệnh trong Safari/Firefox. Nếu bạn sử dụng nó cho nội tuyến <script> chỉ các thẻ, nó dễ sử dụng hơn 'Giá trị băm' cho cả người dùng đã đăng nhập và chưa đăng nhập (và không sử dụng 'nonce').
    Bạn có thể sử dụng hỗn hợp 'không-''sha256-' nhưng trong trường hợp XSS 'không-' có thể được sử dụng lại trong các trang kiếm tiền từ trình duyệt (điều này rất khó và không thể xảy ra).

Tóm lại, bạn có thể sử dụng CSP trong chế độ tương thích ngược của trình duyệt:

script-src 'self' 'strict-dynamic' *.googletagmanager.com *.google-analytics.com
  'sha256-HASH_1' 'sha256-HASH_2' ...;

hoặc

script-src 'self' 'strict-dynamic' *.googletagmanager.com *.google-analytics.com 'noce-SECURENONCE';
  • Hỗ trợ Chrome/Edge/Firefox 'nghiêm ngặt' (loại bỏ mọi nguồn dựa trên máy chủ), do đó CSP thực tế sẽ là script-src 'strict-dynamic' 'sha256-HASH_1' 'sha256-HASH_2' ...; hoặc script-src 'nghiêm ngặt-động' 'không-BẢO MẬT'; tương ứng.

  • Safari không hỗ trợ 'nghiêm ngặt', do đó CSP thực tế sẽ là script-src 'self' *.googletagmanager.com *.google-analytics.com 'sha256-HASH_1' 'sha256-HASH_2' ...; hoặc script-src 'self' *.googletagmanager.com *.google-analytics.com 'noce-SECURENONCE'; tương ứng.

  • bạn không cần phải sử dụng 'nội tuyến không an toàn' tất cả bởi vì nó bị hủy bỏ bởi 'không có giá trị' hoặc 'Giá trị băm' dù sao. Hiện tại không có trình duyệt nào không hỗ trợ 'không có giá trị' / 'Giá trị băm'.

CSP ở trên không cho phép trình xử lý sự kiện nội tuyến trong thẻ, nhưng:

  1. CKEditor-5 không không yêu cầu 'nội tuyến không an toàn' và có thể được cho phép với nonce/hash. Các 'nội tuyến không an toàn' chỉ cần thiết cho CKEditor-4.

  2. Google Analytics không yêu cầu 'nội tuyến không an toàn' và có thể được cho phép với nonce/hash.

  3. Bản thân Trình quản lý thẻ của Google không yêu cầu 'nội tuyến không an toàn' và có thể được cho phép với nonce/hash. Các 'nội tuyến không an toàn' đối với GTM chỉ được yêu cầu nếu bạn sử dụng tập lệnh nội tuyến tùy chỉnh trong "Thẻ HTML tùy chỉnh".
    Sử dụng một 'không có giá trị' có thể được ưu tiên hơn vì nếu tập lệnh GTM được chèn cùng với nonce= thuộc tính, nó sẽ được phân phối lại cho tất cả các tập lệnh được Trình quản lý thẻ chèn vào, ngoại trừ "Thẻ HTML tùy chỉnh".

  4. Nếu bạn sử dụng trình xử lý sự kiện nội tuyến trong các thẻ - một 'nội tuyến không an toàn' là bắt buộc nên quên đi 'nonces', 'băm''nghiêm ngặt-năng động' mã thông báo. kể từ một 'băm không an toàn' không được Safari hỗ trợ, bạn không có cách nào an toàn cho phép trình xử lý sự kiện nội tuyến trong thẻ.

berliner avatar
lá cờ bd
Cảm ơn cho câu trả lời mở rộng này. Tôi có nghi ngờ về các bước tiếp theo mặc dù. Ý tưởng của tôi là cung cấp khả năng bảo mật tối đa cho các trình duyệt hiện đại và không sử dụng thanh thấp chỉ vì các trình duyệt kém hiện đại hơn không hỗ trợ nó. Ví dụ, Safari hiểu nonces, nhưng không hiểu `strict-dynamic`, điều này khiến nó không thể (trong bối cảnh Drupal) có một chương trình phụ trợ hoạt động. Mặt khác, hàm băm không cho phép "kế thừa" CSP giống như nonce làm với `strict-dynamic` (afaik). Và trong Drupal vẫn đi kèm với CKEditor 4, thành thật mà nói, tôi không thấy có cách nào để vượt qua 'nội tuyến không an toàn'.
berliner avatar
lá cờ bd
Vì vậy, việc cung cấp các quy tắc CSP khác nhau dựa trên tác nhân người dùng ngay cả khi nó không đáng tin cậy có phải là điều xấu không? Theo hiểu biết của tôi, các quy tắc CSP thanh thấp sẽ luôn được áp dụng làm cơ sở, nhưng tác nhân người dùng báo cáo là hiện đại, vẫn sẽ nhận được các quy tắc an toàn hơn. Tôi không thấy điều đó sẽ tạo ra vấn đề như thế nào.

Đăng câu trả lời

Hầu hết mọi người không hiểu rằng việc đặt nhiều câu hỏi sẽ mở ra cơ hội học hỏi và cải thiện mối quan hệ giữa các cá nhân. Ví dụ, trong các nghiên cứu của Alison, mặc dù mọi người có thể nhớ chính xác có bao nhiêu câu hỏi đã được đặt ra trong các cuộc trò chuyện của họ, nhưng họ không trực giác nhận ra mối liên hệ giữa câu hỏi và sự yêu thích. Qua bốn nghiên cứu, trong đó những người tham gia tự tham gia vào các cuộc trò chuyện hoặc đọc bản ghi lại các cuộc trò chuyện của người khác, mọi người có xu hướng không nhận ra rằng việc đặt câu hỏi sẽ ảnh hưởng—hoặc đã ảnh hưởng—mức độ thân thiện giữa những người đối thoại.