Thực tiễn tốt nhất về bảo mật javascript

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ống

Ví 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à
    Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    2 được coi là có hại
  • 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ào

Thay 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 thi

Vì 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ại

Vớ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àng

Hã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

  • script-src //host1.com //host2.com
    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 trang
  • script-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ác
  • script-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 qua
    script-src //host1.com //host2.com
    29
  • Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    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'
    21
  • Content-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 HTML
  • Content-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ề
    script-src //host1.com //host2.com
    25 như cũ
  • Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    20 xác định nguồn gốc mà hình ảnh có thể được tải
  • Content-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 thanh
  • Content-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ác
  • Content-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ọi
  • Content-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'
    27
  • Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    26 là đối tác của
    Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    8 cho biểu định kiểu
  • Content-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ại
  • Content-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 khai

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ào

Cá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ì

  • script-src //host1.com //host2.com
    23
  • Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    20
  • 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'
    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'
    75

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ư sau

Content-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ụng

Bấ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ào

Danh sách nguồn cũng chấp nhận bốn từ khóa

  • Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    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. ]

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ệ trong

thẻ 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
02

script-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'
75

Mã 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ắn

Lệ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____43

Mã đượ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ép

Nế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ện

Nế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'
7

Bâ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
19

Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
5

Hã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ày

Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
5

Chính sách của bạn sẽ chứa điều này

script-src //host1.com //host2.com
0

Có 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ối

Tì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
    script-src //host1.com //host2.com
    30 tích hợp, thay vì dựa vào
    Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    53. Các hoạt động JSON gốc có sẵn trong , và chúng hoàn toàn an toàn
  • Viết lại bất kỳ cuộc gọi
    script-src //host1.com //host2.com
    32 hoặc
    script-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
1

sẽ đượ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 ý
    script-src //host1.com //host2.com
    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ó
    Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    53. Chỉ thị ng-csp của AngularJS là một ví dụ điển hình về điều này

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ều

Bá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'
24

script-src //host1.com //host2.com
3

Những báo cáo đó sẽ trông giống như sau

script-src //host1.com //host2.com
4

Phầ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
45

script-src //host1.com //host2.com
5

Chí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

    Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    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ị
    script-src //host1.com //host2.com
    47 để hoạt động bình thường. Lưu ý rằng, theo mặc định, mã
    Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    24 mà Facebook cung cấp sẽ tải một URL tương đối,
    script-src //host1.com //host2.com
    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ậy

  • 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

    script-src //host1.com //host2.com
    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ới
    script-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ài

  • 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

    Content-Security-Policy: default-src //cdn.example.net; child-src 'none'; object-src 'none'
    32 của
    Content-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 động

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
6

Trườ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à đây

script-src //host1.com //host2.com
7

Trườ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
8

Mặ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

Chủ Đề