Các nonce
thuộc tính cho phép bạn “danh sách trắng” nhất định inline script
và style
các yếu tố, trong khi tránh sử dụng các CSP unsafe-inline
chỉ thị (mà sẽ cho phép tất cả các inline script
/ style
), do đó bạn vẫn giữ lại các tính năng chủ chốt của CSP không cho phép inline script
/ style
nói chung.
Vì vậy, nonce
thuộc tính là cách thông báo cho các trình duyệt rằng nội dung nội tuyến của một phần tử tập lệnh hoặc kiểu cụ thể không được một bên thứ ba (độc hại) đưa vào tài liệu, mà thay vào đó, bất cứ ai cố tình đưa tài liệu vào máy chủ từ.
https://developers.google.com/web/fundamentals/security/csp/#if_you_absolTHER_must_use_it đưa ra một ví dụ hay về cách sử dụng nonce
thuộc tính, theo các bước sau:
Đối với mọi yêu cầu, máy chủ Web của bạn nhận được một tài liệu cụ thể, hãy để phần phụ trợ của bạn tạo một chuỗi mã hóa cơ sở ngẫu nhiên 64 mã hóa ít nhất 128 bit dữ liệu từ trình tạo số ngẫu nhiên được bảo mật bằng mật mã; ví dụ EDNnf03nceIOfn39fn3e9h3sdfa
. Đó là nonce của bạn.
Thực hiện nonce được tạo ở bước 1 và đối với bất kỳ nội tuyến nào script
/ style
bạn muốn vào danh sách trắng, hãy tạo mã phụ trợ của bạn chèn một nonce
thuộc tính vào tài liệu trước khi nó được gửi qua dây, với giá trị đó là giá trị:
<script nonce="EDNnf03nceIOfn39fn3e9h3sdfa">…</script>
Thực hiện nonce được tạo trong bước 1, thêm vào nonce-
nó và làm cho phần phụ trợ của bạn tạo tiêu đề CSP với giá trị trong danh sách nguồn cho script-src
hoặc style-src
:
Content-Security-Policy: script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'
Vì vậy, cơ chế sử dụng nonce là một giải pháp thay thế cho việc phụ trợ của bạn tạo ra một hàm băm của nội dung script
hoặc style
bạn muốn cho phép, sau đó chỉ định hàm băm đó trong danh sách nguồn thích hợp trong tiêu đề CSP của bạn.
Lưu ý rằng vì các trình duyệt không (không thể) kiểm tra xem giá trị nonce đã gửi thay đổi giữa các yêu cầu của trang hay không, nên có thể điều tra mặc dù bạn hoàn toàn không thể bỏ qua việc bỏ qua 1 ở trên và không để phụ trợ của bạn làm bất cứ điều gì linh hoạt cho nonce, trong trường hợp đó bạn chỉ có thể đặt một nonce
thuộc tính có giá trị tĩnh vào nguồn HTML của tài liệu của bạn và gửi tiêu đề CSP tĩnh có cùng giá trị nonce đó.
Nhưng lý do bạn không muốn sử dụng một nonce tĩnh theo cách đó là, nó sẽ đánh bại khá nhiều toàn bộ mục đích của việc sử dụng nonce để bắt đầu với, bởi vì, nếu bạn sử dụng một nonce tĩnh như vậy, thì nếu bạn sử dụng một nonce tĩnh như thế, tại thời điểm đó bạn cũng có thể sử dụng unsafe-inline
.