Chính sách bảo mật nội dung có thể làm giảm đáng kể rủi ro và tác động của các cuộc tấn công kịch bản chéo trang trong các trình duyệt hiện đại
Ngày 15 tháng 6 năm 2012 — Cập nhật ngày 19 tháng 6 năm 2020
Mike Tây
TwitterTrang chủ
Liên khúc Joe
TwitterGitHub
Trên trang này
Mô hình bảo mật của web bắt nguồn từ chính sách cùng nguồn gốc. Mã từ
script-src //host1.com //host2.com
9 chỉ nên có quyền truy cập vào dữ liệu của script-src //host1.com //host2.com
9 và Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
1 chắc chắn không bao giờ được phép truy cập. Mỗi nguồn gốc được tách biệt với phần còn lại của web, mang đến cho nhà phát triển một hộp cát an toàn để xây dựng và chơi. Về lý thuyết, điều này là hoàn toàn tuyệt vời. Trên thực tế, những kẻ tấn công đã tìm ra những cách thông minh để phá hoại hệ thốngVí dụ, các cuộc tấn công cross-site scripting [XSS] bỏ qua chính sách gốc bằng cách lừa một trang web gửi mã độc hại cùng với nội dung dự định. Đây là một vấn đề lớn, vì các trình duyệt tin tưởng tất cả mã hiển thị trên một trang là một phần hợp pháp trong nguồn gốc bảo mật của trang đó. XSS Cheat Sheet là một mặt cắt ngang cũ nhưng đại diện cho các phương pháp mà kẻ tấn công có thể sử dụng để vi phạm sự tin tưởng này bằng cách tiêm mã độc. Nếu kẻ tấn công tiêm thành công bất kỳ mã nào, thì trò chơi gần như kết thúc. dữ liệu phiên của người dùng bị xâm phạm và thông tin cần được giữ bí mật bị chuyển đến The Bad Guys. Rõ ràng là chúng tôi muốn ngăn chặn điều đó nếu có thể
Tổng quan này nêu bật một biện pháp bảo vệ có thể làm giảm đáng kể rủi ro và tác động của các cuộc tấn công XSS trong các trình duyệt hiện đại. Chính sách bảo mật nội dung [CSP]
Tóm lược
- Sử dụng danh sách cho phép để cho khách hàng biết những gì được phép và những gì không
- Tìm hiểu những chỉ thị nào có sẵn
- Tìm hiểu các từ khóa họ lấy
- Mã nội tuyến và
2 được coi là có hạiContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
- Báo cáo vi phạm chính sách cho máy chủ của bạn trước khi thực thi chúng
Nguồn danh sách cho phép
Vấn đề bị khai thác bởi các cuộc tấn công XSS là trình duyệt không có khả năng phân biệt giữa tập lệnh là một phần của ứng dụng của bạn và tập lệnh đã bị bên thứ ba chèn mã độc. Ví dụ: nút Google +1 ở cuối trang này tải và thực thi mã từ
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
3 trong ngữ cảnh nguồn gốc của trang này. Chúng tôi tin tưởng mã đó, nhưng chúng tôi không thể mong đợi trình duyệt tự nhận ra rằng mã từ Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
4 là tuyệt vời, trong khi mã từ Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
5 có thể không. Trình duyệt vui vẻ tải xuống và thực thi bất kỳ mã nào mà một trang yêu cầu, bất kể nguồn nàoThay vì mù quáng tin tưởng mọi thứ mà máy chủ cung cấp, CSP xác định tiêu đề HTTP
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
6, cho phép bạn tạo danh sách cho phép các nguồn nội dung đáng tin cậy và hướng dẫn trình duyệt chỉ thực thi hoặc hiển thị tài nguyên từ những nguồn đó. Ngay cả khi kẻ tấn công có thể tìm thấy một lỗ hổng để chèn tập lệnh, tập lệnh sẽ không khớp với danh sách cho phép và do đó sẽ không được thực thiVì chúng tôi tin tưởng
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
4 để cung cấp mã hợp lệ và chúng tôi tin tưởng bản thân mình cũng làm như vậy, hãy xác định chính sách chỉ cho phép tập lệnh thực thi khi nó đến từ một trong hai nguồn đóContent-Security-Policy: script-src 'self' //apis.google.com
Đơn giản, phải không? . Chúng tôi đã chỉ định
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
9 là một nguồn tập lệnh hợp lệ và script-src //host1.com //host2.com
20 là một nguồn khác. Trình duyệt tải xuống và thực thi JavaScript một cách nghiêm túc từ Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
4 qua HTTPS, cũng như từ nguồn gốc của trang hiện tạiVới chính sách này được xác định, trình duyệt chỉ đưa ra lỗi thay vì tải tập lệnh từ bất kỳ nguồn nào khác. Khi một kẻ tấn công thông minh quản lý để đưa mã vào trang web của bạn, chúng sẽ gặp phải một thông báo lỗi thay vì thành công mà chúng mong đợi
Chính sách áp dụng cho nhiều loại tài nguyên
Mặc dù tài nguyên tập lệnh là rủi ro bảo mật rõ ràng nhất, CSP cung cấp một tập hợp phong phú các chỉ thị chính sách cho phép kiểm soát khá chi tiết đối với các tài nguyên mà một trang được phép tải. Bạn đã xem
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
8, vì vậy khái niệm này phải rõ ràngHãy nhanh chóng xem qua phần còn lại của các chỉ thị tài nguyên. Danh sách dưới đây thể hiện trạng thái của các chỉ thị ở cấp độ 2. Thông số kỹ thuật cấp 3 đã được xuất bản, nhưng có trong các trình duyệt chính
23 hạn chế các URL có thể xuất hiện trong phần tửscript-src //host1.com //host2.com
24 của trangscript-src //host1.com //host2.com
25 liệt kê các URL cho worker và nội dung khung được nhúng. Ví dụ.script-src //host1.com //host2.com
26 sẽ cho phép nhúng video từ YouTube chứ không phải từ các nguồn gốc khácscript-src //host1.com //host2.com
27 giới hạn nguồn gốc mà bạn có thể kết nối [thông qua XHR, WebSockets và EventSource]script-src //host1.com //host2.com
28 chỉ định nguồn gốc có thể phục vụ phông chữ web. Phông chữ web của Google có thể được bật thông quascript-src //host1.com //host2.com
29script-src //host1.com //host2.com
20 liệt kê các điểm cuối hợp lệ để gửi từ thẻContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
21Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
22 chỉ định các nguồn có thể nhúng trang hiện tại. Chỉ thị này áp dụng cho các thẻContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
23,Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
24,Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
25 vàContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
26. Không thể sử dụng lệnh này trong thẻContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
27 và chỉ áp dụng cho các tài nguyên không phải HTMLContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
28 không được dùng nữa ở cấp độ 2, nhưng đã được khôi phục ở cấp độ 3. Nếu không xuất hiện vẫn rơi vềContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
25 như cũscript-src //host1.com //host2.com
20 xác định nguồn gốc mà hình ảnh có thể được tảiContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
21 hạn chế nguồn gốc được phép phân phối video và âm thanhContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
22 cho phép kiểm soát Flash và các plugin khácContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
23 giới hạn các loại plugin mà một trang có thể gọiContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
24 chỉ định URL nơi trình duyệt sẽ gửi báo cáo khi chính sách bảo mật nội dung bị vi phạm. Không thể sử dụng lệnh này trong thẻContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
27Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
26 là đối tác củaContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
8 cho biểu định kiểuContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
28 hướng dẫn tác nhân người dùng viết lại lược đồ URL, thay đổi HTTP thành HTTPS. Lệnh này dành cho các trang web có số lượng lớn URL cũ cần được viết lạiContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
29 là chỉ thị CSP Cấp 3 hạn chế các URL có thể được tải dưới dạng worker, shared worker hoặc service worker. Kể từ tháng 7 năm 2017, chỉ thị này đã hạn chế triển khaiContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
Theo mặc định, các chỉ thị được mở rộng. Nếu bạn không đặt chính sách cụ thể cho một lệnh, giả sử là
script-src //host1.com //host2.com
28, thì lệnh đó sẽ hoạt động theo mặc định như thể bạn đã chỉ định Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
31 làm nguồn hợp lệ [ví dụ: bạn có thể tải phông chữ từ bất kỳ đâu mà không bị hạn chế]Bạn có thể ghi đè hành vi mặc định này bằng cách chỉ định một chỉ thị
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
32. Lệnh này xác định giá trị mặc định cho hầu hết các lệnh mà bạn không chỉ định. Nói chung, điều này áp dụng cho bất kỳ chỉ thị nào kết thúc bằng Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
33. Nếu Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
32 được đặt thành Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
35 và bạn không chỉ định lệnh script-src //host1.com //host2.com
28, thì bạn có thể tải phông chữ từ Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
35 và không nơi nào khác. Chúng tôi chỉ xác định Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
8 trong các ví dụ trước của chúng tôi, điều đó có nghĩa là hình ảnh, phông chữ, v.v. có thể được tải từ bất kỳ nguồn gốc nàoCác lệnh sau không sử dụng
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
32 làm phương án dự phòng. Hãy nhớ rằng không thiết lập chúng cũng giống như cho phép bất cứ điều gì
23script-src //host1.com //host2.com
20Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
22Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
23Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
24Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
75Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
Bạn có thể sử dụng nhiều hoặc ít trong số các lệnh này nếu phù hợp với ứng dụng cụ thể của mình, chỉ cần liệt kê từng lệnh trong tiêu đề HTTP, phân tách các lệnh bằng dấu chấm phẩy. Đảm bảo rằng bạn liệt kê tất cả các tài nguyên cần thiết của một loại cụ thể trong một lệnh duy nhất. Nếu bạn đã viết một cái gì đó như
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
76 thì chỉ thị thứ hai sẽ bị bỏ qua. Một cái gì đó như sau sẽ chỉ định chính xác cả hai nguồn gốc là hợp lệscript-src //host1.com //host2.com
Ví dụ: nếu bạn có một ứng dụng tải tất cả tài nguyên của nó từ mạng phân phối nội dung [giả sử,
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
77] và biết rằng bạn không cần bất kỳ nội dung hoặc phần bổ trợ được đóng khung nào, thì chính sách của bạn có thể giống như sauContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
Chi tiết triển khai
Bạn sẽ thấy các tiêu đề
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
78 và Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
79 trong các hướng dẫn khác nhau trên web. Về sau, bạn nên bỏ qua các tiêu đề có tiền tố này. Các trình duyệt hiện đại [ngoại trừ IE] hỗ trợ tiêu đề Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
6 không tiền tố. Đó là tiêu đề bạn nên sử dụngBất kể bạn sử dụng tiêu đề nào, chính sách được xác định trên cơ sở từng trang. bạn sẽ cần gửi tiêu đề HTTP cùng với mọi phản hồi mà bạn muốn đảm bảo được bảo vệ. Điều này mang lại rất nhiều tính linh hoạt, vì bạn có thể tinh chỉnh chính sách cho các trang cụ thể dựa trên nhu cầu cụ thể của chúng. Có lẽ một tập hợp các trang trong trang web của bạn có nút +1, trong khi những trang khác thì không. bạn chỉ có thể cho phép mã nút được tải khi cần thiết
Danh sách nguồn trong mỗi chỉ thị là linh hoạt. Bạn có thể chỉ định các nguồn theo lược đồ [______651,
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
52] hoặc theo phạm vi cụ thể từ chỉ tên máy chủ [Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
53, phù hợp với bất kỳ nguồn gốc nào trên máy chủ đó. bất kỳ sơ đồ nào, bất kỳ cổng nào] tới một URI đủ điều kiện [Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
54, chỉ khớp với HTTPS, chỉ Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
53 và chỉ cổng 443]. Ký tự đại diện được chấp nhận, nhưng chỉ dưới dạng lược đồ, cổng hoặc ở vị trí ngoài cùng bên trái của tên máy chủ. Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
56 sẽ khớp với tất cả các tên miền phụ của Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
53 [nhưng không phải chính Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
53], sử dụng bất kỳ sơ đồ nào, trên bất kỳ cổng nàoDanh sách nguồn cũng chấp nhận bốn từ khóa
59, như bạn có thể mong đợi, không khớp với gìContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
9 khớp với nguồn gốc hiện tại, nhưng không khớp với tên miền phụ của nóContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
51 cho phép JavaScript và CSS nội tuyến. [Chúng tôi sẽ đề cập đến vấn đề này chi tiết hơn một chút. ]Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
52 cho phép các cơ chế chuyển văn bản thành JavaScript nhưContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
53. [Chúng ta cũng sẽ làm được điều này. ]Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
Những từ khóa này yêu cầu dấu nháy đơn. Ví dụ:
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
54 [có dấu ngoặc kép] cho phép thực thi JavaScript từ máy chủ hiện tại; hộp cát
Còn một chỉ thị nữa đáng nói.
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
75. Nó hơi khác so với những trang khác mà chúng tôi đã xem xét, vì nó hạn chế các hành động mà trang có thể thực hiện hơn là các tài nguyên mà trang có thể tải. Nếu có chỉ thị Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
75, trang được xử lý như thể nó được tải bên trong một Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
24 với thuộc tính Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
75. Điều này có thể có nhiều hiệu ứng trên trang. buộc trang vào một nguồn gốc duy nhất và ngăn gửi biểu mẫu, trong số những người khác. Nó nằm ngoài phạm vi của bài viết này một chút, nhưng bạn có thể tìm thấy đầy đủ chi tiết về các thuộc tính hộp cát hợp lệ trongthẻ meta
Cơ chế phân phối ưa thích của CSP là một tiêu đề HTTP. Tuy nhiên, có thể hữu ích khi đặt chính sách trên một trang trực tiếp trong phần đánh dấu. Làm điều đó bằng cách sử dụng thẻ
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
27 với thuộc tính script-src //host1.com //host2.com
02script-src //host1.com //host2.com
2Điều này không thể được sử dụng cho
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
22, Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
24 hoặc Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
75Mã nội tuyến được coi là có hại
Rõ ràng là CSP dựa trên nguồn gốc của danh sách cho phép, vì đó là một cách rõ ràng để hướng dẫn trình duyệt coi các nhóm tài nguyên cụ thể là có thể chấp nhận được và từ chối phần còn lại. Tuy nhiên, danh sách cho phép dựa trên nguồn gốc không giải quyết được mối đe dọa lớn nhất do các cuộc tấn công XSS gây ra. tiêm tập lệnh nội tuyến. Nếu kẻ tấn công có thể chèn một thẻ tập lệnh trực tiếp chứa một số tải trọng độc hại [
script-src //host1.com //host2.com
06], thì trình duyệt không có cơ chế nào để phân biệt nó với một thẻ tập lệnh nội tuyến hợp pháp. CSP giải quyết vấn đề này bằng cách cấm hoàn toàn tập lệnh nội tuyến. đó là cách duy nhất để chắc chắnLệnh cấm này không chỉ bao gồm các tập lệnh được nhúng trực tiếp trong thẻ
script-src //host1.com //host2.com
07 mà còn cả trình xử lý sự kiện nội tuyến và URL script-src //host1.com //host2.com
08. Bạn sẽ cần di chuyển nội dung của các thẻ script-src //host1.com //host2.com
07 vào một tệp bên ngoài và thay thế các URL script-src //host1.com //host2.com
08 và script-src //host1.com //host2.com
11 bằng các lệnh gọi script-src //host1.com //host2.com
12 thích hợp. Ví dụ: bạn có thể viết lại phần sau từContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
2đến một cái gì đó giống như
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
2____43Mã được viết lại có một số ưu điểm trên và ngoài việc hoạt động tốt với CSP; . JavaScript nội tuyến kết hợp cấu trúc và hành vi theo đúng cách bạn không nên làm. Các tài nguyên bên ngoài giúp trình duyệt dễ dàng lưu vào bộ đệm hơn, dễ hiểu hơn đối với các nhà phát triển và thuận lợi cho việc biên dịch và thu nhỏ. Bạn sẽ viết mã tốt hơn nếu bạn thực hiện công việc chuyển mã sang các tài nguyên bên ngoài
Kiểu nội tuyến được xử lý theo cùng một cách. cả thuộc tính
script-src //host1.com //host2.com
13 và thẻ script-src //host1.com //host2.com
13 phải được hợp nhất vào biểu định kiểu bên ngoài để bảo vệ chống lại nhiều phương pháp đánh cắp dữ liệu thông minh đáng ngạc nhiên mà CSS cho phépNếu bạn phải có tập lệnh và kiểu nội tuyến, bạn có thể kích hoạt nó bằng cách thêm
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
51 làm nguồn được phép trong chỉ thị Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
8 hoặc Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
26. Bạn cũng có thể sử dụng nonce hoặc hash [xem bên dưới], nhưng bạn thực sự không nên. Cấm tập lệnh nội tuyến là chiến thắng bảo mật lớn nhất mà CSP cung cấp và việc cấm kiểu nội tuyến cũng làm cứng ứng dụng của bạn. Bạn cần nỗ lực một chút để đảm bảo rằng mọi thứ hoạt động chính xác sau khi di chuyển tất cả mã ra khỏi dòng, nhưng đó là một sự đánh đổi rất đáng để thực hiệnNếu bạn hoàn toàn phải sử dụng nó
CSP Cấp 2 cung cấp khả năng tương thích ngược cho các tập lệnh nội tuyến bằng cách cho phép bạn thêm các tập lệnh nội tuyến cụ thể vào danh sách cho phép bằng cách sử dụng nonce mật mã [số được sử dụng một lần] hoặc hàm băm. Mặc dù điều này có thể rườm rà, nhưng nó rất hữu ích trong trường hợp khẩn cấp
Để sử dụng nonce, hãy cung cấp cho thẻ tập lệnh của bạn một thuộc tính nonce. Giá trị của nó phải khớp với một trong danh sách các nguồn đáng tin cậy. Ví dụ
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
7Bây giờ, hãy thêm nonce vào chỉ thị
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
8 của bạn được thêm vào từ khóa script-src //host1.com //host2.com
19Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
5Hãy nhớ rằng các nonce phải được tạo lại cho mọi yêu cầu trang và chúng phải không thể đoán được
Băm hoạt động theo cách tương tự. Thay vì thêm mã vào thẻ tập lệnh, hãy tạo hàm băm SHA của chính tập lệnh đó và thêm nó vào chỉ thị
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
8. Ví dụ: giả sử trang của bạn chứa nội dung nàyContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
5Chính sách của bạn sẽ chứa điều này
script-src //host1.com //host2.com
0Có một vài điều cần lưu ý ở đây. Tiền tố
script-src //host1.com //host2.com
21 chỉ định thuật toán tạo hàm băm. Trong ví dụ trên, script-src //host1.com //host2.com
22 được sử dụng. CSP cũng hỗ trợ script-src //host1.com //host2.com
23 và script-src //host1.com //host2.com
24. Khi tạo hàm băm, không bao gồm các thẻ script-src //host1.com //host2.com
25. Ngoài ra viết hoa và khoảng trắng cũng quan trọng, bao gồm cả khoảng trắng đầu hoặc cuốiTìm kiếm trên Google về cách tạo hàm băm SHA sẽ dẫn bạn đến các giải pháp bằng bất kỳ ngôn ngữ nào. Sử dụng Chrome 40 trở lên, bạn có thể mở DevTools rồi tải lại trang của mình. Tab Bảng điều khiển sẽ chứa các thông báo lỗi với hàm băm sha256 chính xác cho từng tập lệnh nội tuyến của bạn
đánh giá quá
Ngay cả khi kẻ tấn công không thể đưa tập lệnh trực tiếp vào, chúng vẫn có thể lừa ứng dụng của bạn chuyển đổi văn bản trơ thành JavaScript có thể thực thi được và thay mặt chúng thực thi nó.
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
2, script-src //host1.com //host2.com
27, script-src //host1.com //host2.com
28 và script-src //host1.com //host2.com
29 đều là các vectơ mà qua đó văn bản được đưa vào có thể sẽ thực thi một thứ gì đó độc hại không mong muốn. Phản ứng mặc định của CSP đối với rủi ro này là chặn hoàn toàn tất cả các vectơ nàyĐiều này có nhiều tác động đến cách bạn xây dựng ứng dụng
- Bạn phải phân tích cú pháp JSON thông qua
30 tích hợp, thay vì dựa vàoscript-src //host1.com //host2.com
53. Các hoạt động JSON gốc có sẵn trong , và chúng hoàn toàn an toànContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
- Viết lại bất kỳ cuộc gọi
32 hoặcscript-src //host1.com //host2.com
33 nào bạn hiện đang thực hiện bằng các hàm nội tuyến thay vì chuỗi. Ví dụscript-src //host1.com //host2.com
script-src //host1.com //host2.com
1sẽ được viết tốt hơn như
script-src //host1.com //host2.com
2- Tránh tạo khuôn mẫu nội tuyến trong thời gian chạy. Nhiều thư viện tạo khuôn mẫu sử dụng tùy ý
27 để tăng tốc độ tạo khuôn mẫu trong thời gian chạy. Đó là một ứng dụng tiện lợi của lập trình động, nhưng có nguy cơ đánh giá văn bản độc hại. Một số khung hỗ trợ CSP ngay lập tức, quay trở lại trình phân tích cú pháp mạnh mẽ khi không cóscript-src //host1.com //host2.com
53. Chỉ thị ng-csp của AngularJS là một ví dụ điển hình về điều nàyContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
Tuy nhiên, một lựa chọn tốt hơn sẽ là một ngôn ngữ tạo khuôn mẫu cung cấp khả năng biên dịch trước [ví dụ như Handlebars]. Biên dịch trước các mẫu của bạn có thể giúp trải nghiệm người dùng nhanh hơn so với triển khai thời gian chạy nhanh nhất và nó cũng an toàn hơn. Nếu eval và các anh em chuyển văn bản thành JavaScript của nó cần thiết cho ứng dụng của bạn, bạn có thể kích hoạt chúng bằng cách thêm
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
52 làm nguồn được phép trong chỉ thị Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
8, nhưng chúng tôi thực sự không khuyến khích điều này. Việc cấm khả năng thực thi chuỗi khiến kẻ tấn công khó thực thi mã trái phép trên trang web của bạn hơn nhiềuBáo cáo
Khả năng chặn các tài nguyên không đáng tin cậy phía máy khách của CSP là một chiến thắng lớn cho người dùng của bạn, nhưng sẽ khá hữu ích nếu có một số loại thông báo được gửi lại máy chủ để bạn có thể xác định và loại bỏ bất kỳ lỗi nào cho phép tiêm mã độc ngay từ đầu . Để làm được điều này, bạn có thể hướng dẫn trình duyệt gửi các báo cáo vi phạm có định dạng JSON của
script-src //host1.com //host2.com
38 đến một vị trí được chỉ định trong chỉ thị Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
24script-src //host1.com //host2.com
3Những báo cáo đó sẽ trông giống như sau
script-src //host1.com //host2.com
4Phần này chứa một lượng lớn thông tin sẽ giúp bạn theo dõi nguyên nhân cụ thể của vi phạm, bao gồm trang xảy ra vi phạm [
script-src //host1.com //host2.com
40], liên kết giới thiệu của trang đó [lưu ý rằng không giống như trường tiêu đề HTTP, khóa không bị sai chính tả] Chỉ báo cáo
Nếu bạn mới bắt đầu sử dụng CSP, bạn nên đánh giá trạng thái hiện tại của ứng dụng trước khi đưa ra chính sách hà khắc cho người dùng của mình. Là bước đệm để triển khai hoàn chỉnh, bạn có thể yêu cầu trình duyệt giám sát chính sách, báo cáo vi phạm nhưng không thực thi các hạn chế. Thay vì gửi tiêu đề
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
6, hãy gửi tiêu đề script-src //host1.com //host2.com
45script-src //host1.com //host2.com
5Chính sách được chỉ định trong chế độ chỉ báo cáo sẽ không chặn các tài nguyên bị hạn chế nhưng sẽ gửi báo cáo vi phạm đến vị trí bạn chỉ định. Bạn thậm chí có thể gửi cả hai tiêu đề, thực thi một chính sách trong khi giám sát một chính sách khác. Đây là một cách tuyệt vời để đánh giá tác động của các thay đổi đối với CSP của ứng dụng của bạn. bật báo cáo cho một chính sách mới, theo dõi các báo cáo vi phạm và sửa bất kỳ lỗi nào xuất hiện;
Sử dụng trong thế giới thực
CSP 1 hoàn toàn có thể sử dụng được trong Chrome, Safari và Firefox nhưng hỗ trợ rất hạn chế trong IE 10. Bạn có thể. CSP Cấp 2 đã có trong Chrome kể từ phiên bản 40. Các trang web lớn như Twitter và Facebook đã triển khai tiêu đề [nghiên cứu điển hình của Twitter rất đáng đọc] và tiêu chuẩn này rất sẵn sàng để bạn bắt đầu triển khai trên các trang web của riêng mình
Bước đầu tiên để xây dựng chính sách cho ứng dụng của bạn là đánh giá các tài nguyên bạn đang thực sự tải. Sau khi bạn cho rằng mình nắm được cách mọi thứ được kết hợp với nhau trong ứng dụng của mình, hãy thiết lập chính sách dựa trên những yêu cầu đó. Hãy xem qua một vài trường hợp sử dụng phổ biến và xác định cách tốt nhất chúng ta có thể hỗ trợ chúng trong giới hạn bảo vệ của CSP
Trường hợp sử dụng số 1. tiện ích mạng xã hội
Nút Like của Facebook có một số tùy chọn triển khai. Chúng tôi khuyên bạn nên sử dụng phiên bản
24 vì phiên bản này được hộp cát an toàn với phần còn lại của trang web của bạn. Nó yêu cầu một chỉ thịContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
47 để hoạt động bình thường. Lưu ý rằng, theo mặc định, mãscript-src //host1.com //host2.com
24 mà Facebook cung cấp sẽ tải một URL tương đối,Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
49. Thay đổi điều đó để chỉ định rõ ràng HTTPS.script-src //host1.com //host2.com
50. Không có lý do gì để sử dụng HTTP nếu bạn không phải làm vậyscript-src //host1.com //host2.com
Twitter dựa trên quyền truy cập vào tập lệnh và khung, cả hai đều được lưu trữ tại
51. [Twitter cũng cung cấp một URL tương đối theo mặc định; chỉnh sửa mã để chỉ định HTTPS khi sao chép/dán nó cục bộ. ] Bạn sẽ hoàn tất cài đặt vớiscript-src //host1.com //host2.com
52, miễn là bạn di chuyển đoạn mã JavaScript mà Twitter cung cấp vào một tệp JavaScript bên ngoàiscript-src //host1.com //host2.com
Các nền tảng khác có yêu cầu tương tự và có thể được giải quyết tương tự. Chúng tôi khuyên bạn chỉ nên đặt
32 củaContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
59 và xem bảng điều khiển của bạn để xác định tài nguyên nào bạn sẽ cần kích hoạt để các tiện ích con hoạt độngContent-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
Bao gồm nhiều vật dụng rất đơn giản. chỉ cần kết hợp các chỉ thị chính sách, nhớ hợp nhất tất cả các tài nguyên của một loại thành một chỉ thị duy nhất. Nếu bạn muốn cả ba tiện ích mạng xã hội, chính sách sẽ như thế này
script-src //host1.com //host2.com
6Trường hợp sử dụng #2. lệnh đóng cửa
Giả sử rằng bạn điều hành một trang web ngân hàng và muốn đảm bảo rằng chỉ những tài nguyên do chính bạn viết mới có thể được tải. Trong trường hợp này, hãy bắt đầu với chính sách mặc định chặn hoàn toàn mọi thứ [
script-src //host1.com //host2.com
55] và xây dựng từ đóGiả sử ngân hàng tải tất cả hình ảnh, phong cách và tập lệnh từ CDN tại
script-src //host1.com //host2.com
56 và kết nối qua XHR tới script-src //host1.com //host2.com
57 để kéo nhiều bit dữ liệu xuống. Khung được sử dụng, nhưng chỉ dành cho các trang cục bộ của trang web [không có nguồn gốc của bên thứ ba]. Không có Flash trên trang web, không có phông chữ, không có tính năng bổ sung. Tiêu đề CSP hạn chế nhất mà chúng tôi có thể gửi là đâyscript-src //host1.com //host2.com
7Trường hợp sử dụng #3. chỉ SSL
Quản trị viên diễn đàn thảo luận về nhẫn cưới muốn đảm bảo rằng tất cả các tài nguyên chỉ được tải qua các kênh an toàn nhưng không thực sự viết nhiều mã; . Chính sách sau đây sẽ có hiệu quả
script-src //host1.com //host2.com
8Mặc dù
Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
52 được chỉ định trong Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
32, các chỉ thị kiểu lệnh và tập lệnh không tự động kế thừa nguồn đó. Mỗi lệnh ghi đè hoàn toàn mặc định cho loại tài nguyên cụ thể đóTương lai
Chính sách bảo mật nội dung cấp 2 là Đề xuất của ứng viên. Nhóm làm việc về bảo mật ứng dụng web của W3C đã bắt đầu làm việc với lần lặp tiếp theo của đặc tả, Chính sách bảo mật nội dung cấp 3
Nếu bạn quan tâm đến cuộc thảo luận xung quanh các tính năng sắp ra mắt này, hãy lướt qua kho lưu trữ danh sách gửi thư công khai-webappsec@ hoặc tự mình tham gia