Ngày xuất bản: 17 tháng 11 năm 2025
Từ Chrome 141, bạn có thể tham gia thử nghiệm nguồn gốc để kiểm thử các tính năng mới của Chính sách bảo mật nội dung (CSP) mà Chrome đang giới thiệu. Các tính năng này giúp các trang web tự bảo vệ khỏi XSS bằng cách cho phép các nguồn JavaScript đã biết vào danh sách cho phép một cách hiệu quả hơn. Đưa JavaScript đã biết vào danh sách cho phép và chặn tất cả các nguồn khác là một cách hiệu quả để ngăn chặn XSS. JavaScript do kẻ tấn công chèn vào sẽ không có trong danh sách cho phép, do đó sẽ bị chặn.
Nếu không có các tính năng này, bạn khó có thể có một CSP "nghiêm ngặt" cho phép tất cả các nguồn JavaScript mà không có cơ chế giao tiếp số chỉ dùng một lần giữa máy chủ tập lệnh và trang web, hoặc biết trước toàn bộ hàm băm của tập lệnh. Cả hai phương thức này đều khó triển khai nếu tập lệnh vừa thay đổi thường xuyên vừa được lưu trữ bởi một bên thứ ba riêng biệt nhưng đáng tin cậy. Ngoài ra, nếu bất kỳ tập lệnh nào cần sử dụng eval, thì CSP hiện yêu cầu bạn đưa eval vào danh sách cho phép đối với tất cả tập lệnh, khiến CSP trở nên yếu hơn nhiều.
Chúng tôi đang cố gắng giải quyết khoảng trống này bằng cách cung cấp một cơ chế mạnh mẽ hơn để đưa tập lệnh vào danh sách cho phép dựa trên URL trong script-src và một cơ chế để đưa các lệnh gọi đến eval vào danh sách cho phép. Bạn sẽ có thể sử dụng cơ chế băm hiện có trong script-src để đưa URL của các tập lệnh cụ thể vào danh sách cho phép và JavaScript được truyền đến eval (cũng như các hàm tương tự như eval). Mặc dù danh sách cho phép dựa trên URL có thể không nghiêm ngặt bằng CSP dựa trên tính toàn vẹn, nhưng cơ chế này sẽ là một bước cải tiến lớn so với danh sách cho phép tên máy chủ hiện có.
Chúng tôi tin rằng chính sách này sẽ giúp bạn dễ dàng triển khai chính sách CSP mà vẫn giảm thiểu hiệu quả các cuộc tấn công XSS bằng cách chặn các tập lệnh nội tuyến và eval không được phép. Các tính năng mới này được thiết kế và triển khai cẩn thận để cho phép các trang web đặt một chính sách cung cấp khả năng bảo mật tốt hơn trong những trình duyệt hỗ trợ chức năng mới, mà không gây ra lỗi hoặc giảm khả năng bảo mật trong những trình duyệt không hỗ trợ, mà không cần phải thực hiện thao tác phát hiện tác nhân người dùng.
Trường hợp sử dụng
Đưa một số URL cụ thể vào danh sách cho phép để sử dụng với script-src
Những trang web muốn đưa các tập lệnh cụ thể vào danh sách cho phép để sử dụng với script-src hiện có 2 lựa chọn: đưa nội dung tập lệnh vào danh sách cho phép thông qua tính toàn vẹn của tài nguyên phụ (SRI) hoặc sử dụng host-source để đưa tên máy chủ vào danh sách cho phép. SRI thường không phù hợp với những tập lệnh thường xuyên thay đổi (ví dụ: tập lệnh phân tích). Việc chỉ định host-source sẽ bị bỏ qua khi strict-dynamic cũng được đặt và không phải là một biện pháp bảo vệ toàn diện vì không bao gồm các tham số URL. Thay đổi này sẽ cho phép đưa các tập lệnh vào danh sách cho phép bằng cách sử dụng hàm băm của URL (đầy đủ), hỗ trợ cả tập lệnh động và cấu hình sử dụng strict-dynamic.
Đưa các tập lệnh cụ thể vào danh sách cho phép để sử dụng với hàm eval hoặc các hàm tương tự như eval
Một số trang web yêu cầu sử dụng các hàm eval hoặc hàm tương tự eval (truyền mã dưới dạng chuỗi ký tự trong setTimeout, setInterval và setImmediate). Đối với những trang web này, lựa chọn CSP duy nhất mà chúng có thể sử dụng là unsafe-eval. Lựa chọn này cho phép tất cả các lệnh gọi đến eval. Chúng tôi đang thêm một cơ chế để cho phép liệt kê các đầu vào cụ thể vào eval. Cơ chế mới này cho phép đưa các tập lệnh cụ thể cần thiết vào danh sách cho phép một cách hạn chế bằng cách băm trực tiếp nội dung tập lệnh, thay vì buộc phải cung cấp một CSP unsafe-eval quá rộng.
Bắt đầu
Để dùng thử tính năng hỗ trợ băm tập lệnh và eval, hãy tham gia
bản dùng thử theo nguyên gốc URL và hàm băm eval trong CSP script-src, chạy từ Chrome 141 đến 144.
Thêm hàm băm vào script-src
URL được đưa vào danh sách cho phép bằng cách thêm một giá trị vào chỉ thị CSP script-src dưới dạng url-<hash-algorithm>-<script-url-hash>. Điều này sẽ cho phép thực thi bất kỳ nội dung nào mà URL đó phân phát, bất kể nội dung là gì. Giá trị băm chỉ cần bao gồm URL ban đầu (URL có trên trang), chứ không phải bất kỳ URL nào mà URL đó chuyển hướng đến. Cả URL tuyệt đối và URL tương đối đều được hỗ trợ.
Ví dụ: tiêu đề CSP sau đây sẽ đưa tập lệnh được phân phát tại https://example.com/example.js vào danh sách cho phép:
Content-Security-Policy: script-src 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=';
trong đó 'sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc=' là hàm băm sha256 của "https://example.com/example.js".
Bạn có thể đưa các tập lệnh được đánh giá thông qua eval hoặc new Function vào danh sách cho phép bằng cách thêm eval-<hash-algorithm>-<script-contents-hash> vào src của tập lệnh. Ví dụ: tiêu đề CSP sau đây sẽ cho phép truyền chuỗi alert("hello world") đến eval():
Content-Security-Policy: script-src 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=';
trong đó 'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0=' là hàm băm sha256 của alert("hello world").
Để giúp tăng tốc quá trình áp dụng, khi một trang web chọn tham gia dùng thử nguồn gốc, hàm băm cho cả URL và eval sẽ được in vào bảng điều khiển Công cụ cho nhà phát triển và có trong báo cáo CSP. Điều này có nghĩa là bạn có thể sử dụng một chính sách nghiêm ngặt nhưng report-only để liệt kê tất cả các hàm băm cần thiết cho danh sách cho phép.
Duy trì khả năng tương thích ngược
Để cho phép triển khai các chính sách này trước khi tất cả trình duyệt đều hỗ trợ, bạn có thể liệt kê các hàm băm URL sau danh sách cho phép dựa trên máy chủ lưu trữ. Những trình duyệt hiểu các loại hàm băm mới sẽ bỏ qua danh sách cho phép dựa trên máy chủ lưu trữ trước đó, trong khi những trình duyệt không hiểu các loại hàm băm mới sẽ vẫn thực thi danh sách cho phép dựa trên máy chủ lưu trữ, cho phép các trang web đặt cả hai, sử dụng chính sách nghiêm ngặt hơn trong những trình duyệt hỗ trợ chính sách này mà không gặp rủi ro bị gián đoạn trong những trình duyệt không hỗ trợ, như minh hoạ trong ví dụ sau.
Content-Security-Policy: script-src 'https:' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
Chúng tôi cũng đã giới thiệu strict-dynamic-url, một phiên bản tương đương của strict-dynamic chỉ áp dụng khi bạn đặt hàm băm URL. Vì strict-dynamic khiến danh sách cho phép dựa trên máy chủ lưu trữ bị bỏ qua, nên một trang web muốn đưa một hàm băm cụ thể vào danh sách cho phép và áp dụng strict-dynamic cho hàm băm đó có thể sử dụng một chính sách như:
Content-Security-Policy: https: 'strict-dynamic-url' 'url-sha256-u2cYltM/2wbvoRR0jMZ57KmFdVqqdPYa6GtdykFwBGc='
Trong ví dụ này, những trình duyệt chưa hỗ trợ hàm băm sẽ chỉ thực thi https:. unsafe-eval cũng sẽ bị các trình duyệt hỗ trợ bỏ qua khi có hàm băm eval. Ví dụ: chính sách sau đây sẽ được đánh giá là unsafe-eval. Điều này cho phép sử dụng tất cả eval() trên những trình duyệt chưa hỗ trợ hàm băm eval, trong khi chỉ cho phép eval() của alert("hello world") trong số những trình duyệt hỗ trợ hàm băm eval.
Content-Security-Policy: script-src "unsafe-eval" "'eval-sha256-4vpsisrBP00v+tF/SsQ3RXWWYF28JSvTpR9D/wrxn/0='"
Chia sẻ ý kiến phản hồi
Chúng tôi rất mong nhận được ý kiến phản hồi của nhà phát triển về những tiện ích này cho script-src. Đăng mọi bình luận dưới dạng một vấn đề trên phần giải thích trong github.