Tôi đã thử nhiều thứ khác nhau trong PHP nhưng vẫn chưa tìm được thuật toán chính xác. Đây là mã tôi có bây giờ
if[!function_exists['base64url_encode']]{
function base64url_encode[$data] {
$data = str_replace[array['+', '/'], array['-', '_'], base64_encode[$data]];
return $data;
}
}
$str = "kki98hkl-u5d0-w96i-62dp-xpmr6xlvfnjz:20151110171858:b2c13532-3416-47d9-8592-a541c208f755:hKSeRD98BHngrNa51Q2IgAXtoZ8oYebgY4vQHEYjlmzN9KSbAVTRvQkUPsjOGu4F";
$sec = "LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=";
$signature = mhash[MHASH_SHA256, $str, $sec];
$signature = base64url_encode[$signature];
if[$signature != "P-WgZ8CqV51aI-3TncZj5CpSZh98PjZTYxrvxkmQYmI="]
echo "wrong: $signature";
else
echo "correct";
Nó cho chữ ký này
K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Như bạn thấy, độ dài 44 ký tự là chính xác. Xin hãy giúp tôi tìm ra lỗi, vấn đề đơn giản này khiến tôi mất hàng giờ và không có giải pháp
[PHP 5 >= 5. 1. 2, PHP 7, PHP 8, hàm băm PECL >= 1. 1]
hash_hmac — Tạo giá trị băm có khóa bằng phương thức HMAC
Sự miêu tả
hash_hmac [
chuỗi
75,K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
string
76,K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
string
77,K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
bool
0 = LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
1LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
]: chuỗi
Thông số
LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
2Tên thuật toán băm đã chọn [i. e. "md5", "sha256", "haval160,4", v.v. ] Xem hash_hmac_algos[] để biết danh sách các thuật toán được hỗ trợ.
LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
3Tin nhắn được băm
LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
4Khóa bí mật dùng chung được sử dụng để tạo biến thể HMAC của thông báo tóm tắt
LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
5Khi được đặt thành
LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
6, xuất dữ liệu nhị phân thô. LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
1 xuất ra chữ thường hexitsGiá trị trả về
Trả về một chuỗi chứa thông báo tóm tắt được tính toán dưới dạng hexit chữ thường trừ khi
LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
5 được đặt thành true trong trường hợp đó, biểu diễn nhị phân thô của thông báo tóm tắt được trả vềNhật ký thay đổi
Mô tả phiên bản8. 0. 0 hash_hmac[] hiện ném ra một ngoại lệ ValueError nếuLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
2 không xác định hoặc . 7. 2. 0Việc sử dụng các hàm băm không mã hóa [adler32, crc32, crc32b, fnv132, fnv1a32, fnv164, fnv1a64, joaat] đã bị vô hiệu hóa. ví dụ
Ví dụ #1 hash_hmac[] ví dụ
K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
31Ví dụ trên sẽ xuất ra
K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
4Xem thêm
- hash[] - Tạo giá trị băm [thông báo tóm tắt]
- hash_hmac_algos[] - Trả về danh sách các thuật toán băm đã đăng ký phù hợp với hash_hmac
- hash_init[] - Khởi tạo bối cảnh băm gia tăng
- hash_hmac_file[] - Tạo giá trị băm có khóa bằng phương thức HMAC và nội dung của một tệp đã cho
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
- Tóm lược
- Nguồn danh sách cho phép
- Chính sách áp dụng cho nhiều loại tài nguyên
- Chi tiết triển khai
- hộp cát
- thẻ meta
- Mã nội tuyến được coi là có hại
- Nếu bạn hoàn toàn phải sử dụng nó
- đánh giá quá
- Báo cáo
- Chỉ báo cáo
- Sử dụng trong thế giới thực
- Trường hợp sử dụng số 1. tiện ích mạng xã hội
- Trường hợp sử dụng #2. lệnh đóng cửa
- Trường hợp sử dụng #3. chỉ SSL
- Tương lai
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ừ
59 chỉ nên có quyền truy cập vào dữ liệu củaK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
59 và chắc chắnK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
71 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ốngK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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à
72 được coi là có hạiK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
- 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 vào một cách độc hại. Ví dụ: nút Google +1 ở cuối trang này tải và thực thi mã từ
73 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ừK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
74 là tuyệt vời, trong khi mã từK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
75 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àoK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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
76, 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ừ các 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 thiK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Vì chúng tôi tin tưởng
74 để 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 đóK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
4LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
Đơn giản, phải không? . Chúng tôi đã chỉ định
79 là một nguồn tập lệnh hợp lệ vàK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
70 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ừLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
74 qua HTTPS, cũng như từ nguồn gốc của trang hiện tạiK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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
78, vì vậy khái niệm này phải rõ ràngK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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 phần lớn chưa được triển khai trong các trình duyệt chính
73 hạn chế các URL có thể xuất hiện trong phần tửLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
74 của trangLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
75 liệt kê các URL cho worker và nội dung khung được nhúng. Ví dụ.LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
76 sẽ cho phép nhúng video từ YouTube chứ không phải từ các nguồn gốc khácLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
77 giới hạn nguồn gốc mà bạn có thể kết nối [thông qua XHR, WebSockets và EventSource]LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
78 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 kích hoạt thông quaLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
79LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
70 liệt kê các điểm cuối hợp lệ để gửi từ thẻLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
71LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
72 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ẻLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
73,LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
74,LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
75 vàLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
76. Không thể sử dụng lệnh này trong các thẻLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
77 và chỉ áp dụng cho các tài nguyên không phải HTMLLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
78 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 thì vẫn rơi vềLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
75 như cũLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
70 xác định nguồn gốc mà hình ảnh có thể được tảiLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
71 hạn chế nguồn gốc được phép phân phối video và âm thanhLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
72 cho phép kiểm soát Flash và các plugin khácLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
73 giới hạn các loại plugin mà một trang có thể gọiLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
74 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. Chỉ thị này không thể được sử dụng trong các thẻLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
77LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
76 là đối tác củaLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
78 cho biểu định kiểuK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
78 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ạiLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
79 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 khaiLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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à
78, thì lệnh đó sẽ hoạt động theo mặc định như thể bạn đã chỉ địnhLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
81 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ế]LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
Bạn có thể ghi đè hành vi mặc định này bằng cách chỉ định một chỉ thị
82. 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ằngLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
83. NếuLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
82 được đặt thànhLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
85 và bạn không chỉ định lệnhLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
78, thì bạn có thể tải phông chữ từLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
85 và không nơi nào khác. Chúng tôi chỉ chỉ địnhLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
78 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àoK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Các lệnh sau không sử dụng
82 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ìLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
73LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
70LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
72LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
73LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
74LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
25LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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ư
26, 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ệLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
5K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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ử,
27] 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ư sauLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
7K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Chi tiết triển khai #
Bạn sẽ thấy các tiêu đề
28 vàLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
29 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 đềLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
76 không tiền tố. Đó là tiêu đề bạn nên sử dụngK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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 đồ [
01,LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
02] hoặc theo phạm vi cụ thể từ chỉ tên máy chủ [LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
03, 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 [LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
04, chỉ khớp với HTTPS, chỉLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
03 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ủ.LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
06 sẽ khớp với tất cả các tên miền phụ củaLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
03 [nhưng không phải chínhLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
03], sử dụng bất kỳ sơ đồ nào, trên bất kỳ cổng nàoLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
Danh sách nguồn cũng chấp nhận bốn từ khóa
09, như bạn có thể mong đợi, không có gì phù hợpLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
79 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óK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
01 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. ]LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
02 cho phép các cơ chế chuyển văn bản thành JavaScript nhưLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
03. [Chúng ta cũng sẽ làm được điều này. ]LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
Những từ khóa này yêu cầu dấu nháy đơn. Ví dụ:
04 [có dấu ngoặc kép] cho phép thực thi JavaScript từ máy chủ hiện tại;LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
hộp cát #
Còn một chỉ thị nữa đáng nói.
25. 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ịLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
25, trang được xử lý như thể nó được tải bên trong mộtLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
74 với thuộc tínhLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
25. Đ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 phần "Hộp cát" của thông số HTML5LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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ẻ
77 với thuộc tínhLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
502K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
7LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
Điều này không thể được sử dụng cho
72,LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
74 hoặcLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
25LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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 [
506], 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ắnK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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 vào các thẻ
507 mà còn cả các trình xử lý sự kiện nội tuyến và các URLK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
508. Bạn sẽ cần di chuyển nội dung của các thẻK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
507 vào một tệp bên ngoài và thay thế các URLK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
508 vàK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
511 bằng các lệnh gọiK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
512 thích hợp. Ví dụ: bạn có thể viết lại phần sau từK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
7LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
đến một cái gì đó giống như
7LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
8LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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
513 và thẻK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
513 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épK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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
01 làm nguồn được phép trong chỉ thịLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
78 hoặcK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
76. 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. Cần phải 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ệnLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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ụ
2LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
Bây giờ, hãy thêm nonce vào chỉ thị
78 của bạn được thêm vào từ khóaK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
519K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
0LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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ị
78. Ví dụ: giả sử trang của bạn chứa nội dung nàyK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
0LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
Chính sách của bạn sẽ chứa điều này
50K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Có một vài điều cần lưu ý ở đây. Tiền tố
521 chỉ định thuật toán tạo hàm băm. Trong ví dụ trên,K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
522 được sử dụng. CSP cũng hỗ trợK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
523 vàK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
524. Khi tạo hàm băm, không bao gồm các thẻK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
525. 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ốiK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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ó.
72,K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
527,K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
528 vàK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
529 đề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àyK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Đ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
530 tích hợp, thay vì dựa vàoK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
03. Các hoạt động JSON gốc có sẵn trong mọi trình duyệt kể từ IE8 và chúng hoàn toàn an toànLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
- Viết lại bất kỳ cuộc gọi
532 hoặcK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
533 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ụK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
51K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
sẽ được viết tốt hơn như
52K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
- 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ự do
527 để 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óK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
03. Chỉ thị ng-csp của AngularJS là một ví dụ điển hình về điều nàyLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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
02 làm nguồn được phép trong chỉ thịLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
78, 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ềuK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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
538 đến một vị trí được chỉ định trong chỉ thịK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
74LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
53K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Những báo cáo đó sẽ trông giống như sau
54K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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 [
540], 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ả]K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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 đề
76, hãy gửi tiêu đềK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
545K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
55K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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 theo dõi 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;
Cách 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ể xem cụ thể tại caniuse. com. 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 đã 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 truyền thô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
74 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ịLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
547 để hoạt động bình thường. Lưu ý rằng, theo mặc định, mãK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
74 mà Facebook cung cấp sẽ tải một URL tương đối,LRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
549. Thay đổi điều đó để chỉ định rõ ràng HTTPS.K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
550. Không có lý do gì để sử dụng HTTP nếu bạn không phải làm vậyK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Nút Tweet của 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
551. [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ớiK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
552, 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àiK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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
82 củaLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
09 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 độngLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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
56K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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 một chính sách mặc định chặn hoàn toàn mọi thứ [
555] và xây dựng từ đóK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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
556 và kết nối qua XHR tớiK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
557 để 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à đâyK9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
57K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
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ả
58K9lw3V-k5gOedmVwmO5vC7cOn82JSEXsNguozCAOU2c=
Mặc dù
02 được chỉ định trongLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
82, 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ể đóLRH9CAkNs-zoU3hxHbrtY0CUUcmqzibPeN7x6-vwNWQ=
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