Content Security Policy và CMP của bạn: Cho CSP và sự đồng ý cùng hoạt động

Hai lớp bảo mật phải thống nhất với nhau

Content Security Policy (CSP) cho trình duyệt biết trang được phép tải tập lệnh, kiểu dáng, hình ảnh, khung và các yêu cầu mạng từ những nguồn nào. Một nền tảng quản lý sự đồng ý làm công việc ngược lại: quyết định những tập lệnh nào trong số đó được phép chạy dựa trên lựa chọn của người dùng. Khi hai thứ được cấu hình riêng rẽ, chúng va chạm nhau. CMP không tải được vì CSP chặn nó, hoặc CSP bị nới lỏng quá mức để chiều theo CMP và thẻ quảng cáo đến mức không còn bảo vệ được gì.

Hướng dẫn này giải thích CMP thường cần những chỉ thị CSP nào, nonce tương tác với việc chèn tập lệnh ra sao, và cách triển khai thay đổi mà không làm hỏng banner.

CMP thường cần gì từ CSP

Yêu cầu chính xác phụ thuộc vào nhà cung cấp, vì vậy hãy luôn bắt đầu từ tài liệu của chính CMP của bạn. Nói chung, hãy kiểm tra các chỉ thị sau:

Trên các trang dùng TCF, hãy nhớ rằng CMP cũng tạo một khung định vị tên là __tcfapiLocator trên trang. Khung này được tạo ra mà không có nguồn từ xa, nên thường không cần mục frame-src, nhưng đáng để xác nhận trong lúc kiểm thử.

Vấn đề stub nội tuyến

Hầu hết CMP yêu cầu bạn đặt một tập lệnh nội tuyến nhỏ — stub — vào phần head của trang, để các tập lệnh khác có thể xếp hàng các lệnh gọi trước khi CMP chính được tải. Một CSP nghiêm ngặt sẽ chặn tập lệnh nội tuyến trừ khi bạn cho phép rõ ràng. Bạn có ba lựa chọn:

  1. Nonce. Tạo một giá trị ngẫu nhiên cho mỗi phản hồi, thêm nó vào tiêu đề CSP dưới dạng 'nonce-...' và vào thẻ <script> của stub. Đây là lựa chọn linh hoạt nhất cho các trang động.
  2. Băm (hash). Thêm giá trị băm SHA-256 của nội dung chính xác của stub vào script-src. Cách này hiệu quả với trang tĩnh, nhưng bất kỳ thay đổi nào với stub, dù chỉ là khoảng trắng, cũng làm nó hỏng.
  3. Tự lưu trữ stub dưới dạng tệp bên ngoài trên tên miền của bạn, được 'self' bao phủ. Cách này cần cẩn thận để đảm bảo nó vẫn tải đủ sớm.

Tránh dùng 'unsafe-inline' như một đường tắt. Nó cho phép mọi tập lệnh nội tuyến, làm mất đi phần lớn sự bảo vệ mà CSP mang lại.

Nonce và các tập lệnh do CMP chèn vào

Một CMP chặn tập lệnh cho đến khi có sự đồng ý thường hoạt động bằng cách giữ chúng lại và chèn vào sau. Với CSP dựa trên nonce, các tập lệnh được chèn đó cũng cần được cho phép. Có hai cách tiếp cận phổ biến:

Trình quản lý thẻ đặt ra cùng câu hỏi đó. Nếu bạn tải thẻ quảng cáo và phân tích qua trình quản lý thẻ, hãy làm theo tài liệu của nó về nonce và đảm bảo CMP cùng trình quản lý thẻ dùng một cách tiếp cận nhất quán.

Thẻ quảng cáo khiến CSP khó hơn

Quảng cáo lập trình tải tập lệnh và khung từ nhiều tên miền, và danh sách đó thay đổi khi các đối tác nhu cầu thay đổi. Nhà xuất bản thường chọn một trong hai hướng:

Dù theo cách nào, CMP cũng nên nằm trong danh sách cho phép tường minh, chứ không chỉ được bao phủ bởi ký tự đại diện, để một thay đổi CSP không bao giờ âm thầm vô hiệu hóa banner.

Triển khai bằng chế độ Report-Only

Hãy dùng tiêu đề Content-Security-Policy-Report-Only trước. Trình duyệt báo cáo các vi phạm mà không chặn bất cứ thứ gì, nhờ đó bạn thấy được chính sách mới sẽ làm hỏng điều gì.

  1. Triển khai chính sách ở chế độ report-only cùng một điểm cuối báo cáo.
  2. Tải các trang trong hồ sơ trình duyệt sạch và đi qua toàn bộ luồng đồng ý: lần truy cập đầu tiên, chấp nhận tất cả, từ chối tất cả, lựa chọn tùy chỉnh, rút lại sự đồng ý.
  3. Xem lại các báo cáo vi phạm và bảng điều khiển trình duyệt để tìm các tài nguyên CMP bị chặn.
  4. Điều chỉnh chính sách, rồi chuyển sang chế độ thực thi.
  5. Giữ báo cáo luôn bật sau khi thực thi để phát hiện hồi quy.

Triệu chứng của xung đột CSP

Những điểm chính

← Blog Đọc tất cả →