Mục đích của thuộc tính nonce HTML của HTML đối với các thành phần tập lệnh và kiểu là gì?


139

W3C cho biết có một thuộc tính mới trong HTML5.1 được yêu noncecầu stylescriptcó thể được sử dụng bởi Chính sách bảo mật nội dung của trang web.

Tôi đã hiểu về nó nhưng cuối cùng không hiểu nó thực sự thuộc tính này làm gì và có gì thay đổi khi sử dụng nó?


2
Có vẻ như đó chỉ là một chút bảo mật cho trang web của bạn, bạn thêm nó vào một liên kết hoặc một hình thức và khi trang được phục vụ, nếu nonce không khớp với trang của bạn, thì bạn không phục vụ trang
Pete

@Pete Ý bạn là sau đó không ai có thể tải của bạn scriptstyle? Một cái gì đó như lệnh cấm liên kết?
ata

nó cũng dành cho các trang bình thường và xác thực mẫu
Pete

Câu trả lời:


195

Các noncethuộc tính cho phép bạn “danh sách trắng” nhất định inline scriptstylecác yếu tố, trong khi tránh sử dụng các CSP unsafe-inlinechỉ 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/ stylenói chung.

Vì vậy, noncethuộ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 noncethuộc tính, theo các bước sau:

  1. Đố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.

  2. 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/ stylebạ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 noncethuộ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>
  3. 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-srchoặ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 scripthoặc stylebạ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 noncethuộ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.


17
Không phải để xác minh người dùng, vì nó xác minh rằng nội dung nội tuyến của một tập lệnh hoặc thành phần kiểu cụ thể không được đưa vào tài liệu của bên thứ ba (độc hại) của tôi, mà thay vào đó, ai đó cố tình đưa vào tài liệu được phục vụ từ. (Tôi sẽ cập nhật câu trả lời của mình để nói điều đó.)
sIDIAbarker

3
Các nonces không cần được lưu trữ, thay vào đó chúng được tạo trong bộ nhớ và chèn vào tiêu đề CSP và tài liệu HTML được gửi qua dây trong các phản hồi (không phải cho nguồn được lưu trữ trên hệ thống tệp / cơ sở dữ liệu của máy chủ).
sIDIAbarker

3
Theo như bất kỳ lý do nào để nỗ lực sử dụng noncethuộc tính, nếu bạn không thực sự cần sử dụng nó, thì đừng. Nó thực sự chỉ có ý nghĩa đối với các trường hợp vì một số lý do mà bạn không thể (chưa) loại bỏ một số nội dung tập lệnh hoặc kiểu nội dung khỏi một tài liệu cụ thể (nhưng sẽ xóa nó sau). Vì vậy, nếu một số lý do bạn bị mắc kẹt với nhu cầu giữ nội dung tập lệnh và kiểu nội tuyến, thì trong thời gian đó, ít nhất bạn có thể sử dụng cơ chế nonce để cho phép trình duyệt xác minh rằng chúng vẫn ổn. Nếu không, bạn chỉ nên sử dụng hoàn toàn CSP như dự định thực sự và không cho phép bất kỳ thành phần tập lệnh hoặc kiểu nội tuyến nào
sIDIAbarker

2
@sIDIAbarker, một nonce trống làm gì? Tôi đang xem các trang với <script type="text/javascript" nonce><style type="text/css" nonce>
Pacerier

7
Lưu ý: Nếu tập lệnh của bạn là tĩnh, tôi khuyên bạn nên sử dụng hàm băm CSP, thay vì tập lệnh.
Brian
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.