Tìm hiểu thêm về các tiêu đề có thể giúp trang web của bạn an toàn và nhanh chóng tra cứu những thông tin quan trọng nhất.
Bài viết này liệt kê những tiêu đề bảo mật quan trọng nhất mà bạn có thể sử dụng để bảo vệ trang web của mình. Hãy sử dụng danh sách này để tìm hiểu các tính năng bảo mật dựa trên web, tìm hiểu cách triển khai các tính năng đó trên trang web của bạn và tham khảo khi bạn cần lời nhắc.
- Các tiêu đề bảo mật được đề xuất cho những trang web xử lý dữ liệu người dùng nhạy cảm:
- Chính sách bảo mật nội dung (CSP)
- Các loại đáng tin cậy
- Các tiêu đề bảo mật nên dùng cho tất cả các trang web:
- X-Content-Type-Options
- X-Frame-Options
- Cross-Origin Resource Policy (CORP)
- Cross-Origin Opener Policy (COOP)
- HTTP Strict Transport Security (HSTS)
- Tiêu đề bảo mật cho các trang web có chức năng nâng cao:
- Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS)
- Chính sách đối với trình nhúng trên nhiều nguồn gốc (COEP)
Trước khi tìm hiểu về tiêu đề bảo mật, hãy tìm hiểu về các mối đe doạ đã biết trên web và lý do bạn nên sử dụng các tiêu đề bảo mật này.
Bảo vệ trang web của bạn khỏi các lỗ hổng bảo mật do tiêm mã độc
Lỗ hổng bảo mật về việc chèn xảy ra khi dữ liệu không đáng tin cậy do ứng dụng của bạn xử lý có thể ảnh hưởng đến hành vi của ứng dụng và thường dẫn đến việc thực thi các tập lệnh do kẻ tấn công kiểm soát. Lỗ hổng phổ biến nhất do lỗi chèn gây ra là tập lệnh trên nhiều trang web (XSS) ở nhiều dạng, bao gồm XSS phản chiếu, XSS được lưu trữ, XSS dựa trên DOM và các biến thể khác.
Thông thường, lỗ hổng XSS có thể cho phép kẻ tấn công truy cập hoàn toàn vào dữ liệu người dùng do ứng dụng xử lý và mọi thông tin khác được lưu trữ trong cùng một nguồn gốc web.
Các biện pháp bảo vệ truyền thống chống lại các đoạn mã chèn bao gồm việc sử dụng nhất quán các hệ thống mẫu HTML tự động thoát, tránh sử dụng các API JavaScript nguy hiểm và xử lý đúng dữ liệu người dùng bằng cách lưu trữ các tệp tải lên trong một miền riêng biệt và dọn dẹp HTML do người dùng kiểm soát.
- Sử dụng Chính sách bảo mật nội dung (CSP) để kiểm soát những tập lệnh mà ứng dụng của bạn có thể thực thi nhằm giảm thiểu nguy cơ bị chèn mã.
- Sử dụng Trusted Types để thực thi quy trình dọn dẹp dữ liệu được truyền vào các API JavaScript nguy hiểm.
- Sử dụng X-Content-Type-Options để ngăn trình duyệt diễn giải sai các loại MIME của tài nguyên trên trang web của bạn, điều này có thể dẫn đến việc thực thi tập lệnh.
Cách ly trang web của bạn với các trang web khác
Tính chất mở của web cho phép các trang web tương tác với nhau theo những cách có thể vi phạm các yêu cầu bảo mật của ứng dụng. Điều này bao gồm cả việc vô tình thực hiện các yêu cầu đã xác thực hoặc nhúng dữ liệu từ một ứng dụng khác vào tài liệu của kẻ tấn công, cho phép kẻ tấn công sửa đổi hoặc đọc dữ liệu ứng dụng.
Các lỗ hổng phổ biến làm suy yếu khả năng cách ly web bao gồm clickjacking, giả mạo yêu cầu trên nhiều trang web (CSRF), đưa vào tập lệnh trên nhiều trang web (XSSI) và nhiều rò rỉ trên nhiều trang web.
- Sử dụng X-Frame-Options để ngăn các tài liệu của bạn bị một trang web độc hại nhúng.
- Sử dụng Chính sách về tài nguyên trên nhiều nguồn gốc (CORP) để ngăn một trang web trên nhiều nguồn gốc đưa tài nguyên của trang web vào.
- Sử dụng Chính sách Cross-Origin Opener Policy (COOP) để bảo vệ các cửa sổ trên trang web của bạn khỏi các hoạt động tương tác của các trang web độc hại.
- Sử dụng Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS) để kiểm soát quyền truy cập vào tài nguyên của trang web từ các tài liệu trên nhiều nguồn gốc.
Phát triển web sau Spectre là một tài liệu rất hay nếu bạn quan tâm đến các tiêu đề này.
Xây dựng một trang web mạnh mẽ và an toàn
Spectre đặt mọi dữ liệu được tải vào cùng một nhóm bối cảnh duyệt web có thể đọc được mặc dù chính sách cùng nguồn. Các trình duyệt hạn chế những tính năng có thể khai thác lỗ hổng bảo mật đằng sau một môi trường đặc biệt có tên là "cách ly nhiều nguồn". Với tính năng cách ly nhiều nguồn gốc, bạn có thể sử dụng các tính năng mạnh mẽ như SharedArrayBuffer.
- Sử dụng Chính sách đối với trình nhúng trên nhiều nguồn gốc (COEP) cùng với COOP để bật tính năng tách biệt trên nhiều nguồn gốc.
Mã hoá lưu lượng truy cập vào trang web của bạn
Các vấn đề về mã hoá xuất hiện khi một ứng dụng không mã hoá hoàn toàn dữ liệu trong quá trình truyền, cho phép những kẻ tấn công nghe lén tìm hiểu về các hoạt động tương tác của người dùng với ứng dụng.
Mã hoá không đầy đủ có thể xảy ra trong các trường hợp sau: không sử dụng HTTPS, nội dung hỗn hợp, thiết lập cookie mà không có thuộc tính Secure (hoặc tiền tố __Secure), hoặc logic xác thực CORS lỏng lẻo.
- Sử dụng Bảo mật truyền tải nghiêm ngặt HTTP (HSTS) để phân phát nội dung một cách nhất quán thông qua HTTPS.
Chính sách bảo mật nội dung (CSP)
Tập lệnh trên nhiều trang web (XSS) là một cuộc tấn công trong đó lỗ hổng trên một trang web cho phép một tập lệnh độc hại được chèn và thực thi.
Content-Security-Policy cung cấp thêm một lớp để giảm thiểu các cuộc tấn công XSS bằng cách hạn chế những tập lệnh mà trang có thể thực thi.
Bạn nên bật CSP nghiêm ngặt bằng một trong các phương pháp sau:
- Nếu bạn hiển thị các trang HTML trên máy chủ, hãy sử dụng CSP nghiêm ngặt dựa trên số chỉ dùng một lần.
- Nếu HTML của bạn phải được phân phát tĩnh hoặc lưu vào bộ nhớ đệm (ví dụ: nếu đó là một ứng dụng một trang), hãy sử dụng CSP nghiêm ngặt dựa trên hàm băm.
Ví dụ về cách sử dụng: CSP dựa trên số chỉ dùng một lần
Content-Security-Policy:
script-src 'nonce-{RANDOM1}' 'strict-dynamic' https: 'unsafe-inline';
object-src 'none';
base-uri 'none';
Các trường hợp sử dụng được đề xuất
1. Sử dụng CSP nghiêm ngặt dựa trên số chỉ dùng một lần {: #nonce-based-csp}
Nếu bạn hiển thị các trang HTML trên máy chủ, hãy sử dụng CSP nghiêm ngặt dựa trên số chỉ dùng một lần.
Tạo giá trị số chỉ dùng một lần cho tập lệnh mới cho mọi yêu cầu ở phía máy chủ và đặt tiêu đề sau:
tệp cấu hình máy chủ
Content-Security-Policy: script-src 'nonce-{RANDOM1}' 'strict-dynamic' https: 'unsafe-inline'; object-src 'none'; base-uri 'none';
Trong HTML, để tải các tập lệnh, hãy đặt thuộc tính nonce của tất cả các thẻ <script> thành cùng một chuỗi {RANDOM1}.
index.html
<script nonce="{RANDOM1}" src="https://example.com/script1.js"></script>
<script nonce="{RANDOM1}">
// Inline scripts can be used with the <code>nonce</code> attribute.
</script>Google Photos là một ví dụ điển hình về CSP nghiêm ngặt dựa trên số chỉ dùng một lần. Sử dụng Công cụ cho nhà phát triển để xem cách sử dụng.
2. Sử dụng CSP nghiêm ngặt dựa trên hàm băm {: #hash-based-csp}
Nếu HTML của bạn phải được phân phát tĩnh hoặc lưu vào bộ nhớ đệm (ví dụ: nếu bạn đang tạo một ứng dụng một trang), hãy sử dụng CSP nghiêm ngặt dựa trên hàm băm.
tệp cấu hình máy chủ
Content-Security-Policy: script-src 'sha256-{HASH1}' 'sha256-{HASH2}' 'strict-dynamic' https: 'unsafe-inline'; object-src 'none'; base-uri 'none';
Trong HTML, bạn sẽ cần phải nội tuyến các tập lệnh để áp dụng chính sách dựa trên hàm băm, vì hầu hết các trình duyệt không hỗ trợ băm các tập lệnh bên ngoài.
index.html
<script> ...// your script1, inlined </script> <script> ...// your script2, inlined </script>
Để tải tập lệnh bên ngoài, hãy đọc phần "Tải tập lệnh có nguồn một cách linh động" trong phần Lựa chọn B: Tiêu đề phản hồi CSP dựa trên hàm băm.
CSP Evaluator là một công cụ hữu ích để đánh giá CSP của bạn, đồng thời cũng là một ví dụ hay về CSP nghiêm ngặt dựa trên số chỉ dùng một lần. Sử dụng Công cụ cho nhà phát triển để xem cách sử dụng.
Các trình duyệt được hỗ trợ
Những điều khác cần lưu ý về CSP (Chính sách bảo mật nội dung)
- Chỉ thị
frame-ancestorsbảo vệ trang web của bạn khỏi hành vi tấn công bằng cách nhấp chuột giả mạo – một rủi ro phát sinh nếu bạn cho phép các trang web không đáng tin cậy nhúng trang web của bạn. Nếu muốn có giải pháp đơn giản hơn, bạn có thể dùngX-Frame-Optionsđể chặn tải, nhưngframe-ancestorssẽ cung cấp cho bạn một cấu hình nâng cao để chỉ cho phép các nguồn cụ thể làm đơn vị nhúng. - Bạn có thể đã sử dụng CSP để đảm bảo rằng tất cả tài nguyên trên trang web của bạn đều được tải qua HTTPS. Điều này đã trở nên ít phù hợp hơn: ngày nay, hầu hết các trình duyệt đều chặn nội dung hỗn hợp.
- Bạn cũng có thể đặt CSP ở chế độ chỉ báo cáo.
- Nếu không thể đặt CSP làm tiêu đề phía máy chủ, bạn cũng có thể đặt CSP làm thẻ meta. Xin lưu ý rằng bạn không thể sử dụng chế độ chỉ báo cáo cho thẻ meta (mặc dù điều này có thể thay đổi).
Tìm hiểu thêm
Loại đáng tin cậy
Tấn công XSS dựa trên DOM là một cuộc tấn công trong đó dữ liệu độc hại được truyền vào một đích nhận hỗ trợ thực thi mã động, chẳng hạn như eval() hoặc .innerHTML.
Trusted Types cung cấp các công cụ để viết, đánh giá bảo mật và duy trì các ứng dụng không có DOM XSS. Bạn có thể bật các loại này thông qua CSP và mặc định bảo mật mã JavaScript bằng cách giới hạn các API web nguy hiểm để chỉ chấp nhận một đối tượng đặc biệt – một Trusted Type.
Để tạo các đối tượng này, bạn có thể xác định các chính sách bảo mật để đảm bảo rằng các quy tắc bảo mật (chẳng hạn như thoát hoặc dọn dẹp) được áp dụng nhất quán trước khi dữ liệu được ghi vào DOM. Sau đó, các chính sách này là những nơi duy nhất trong mã có thể gây ra DOM XSS.
Ví dụ về cách sử dụng
Content-Security-Policy: require-trusted-types-for 'script'
// Feature detection
if (window.trustedTypes && trustedTypes.createPolicy) {
// Name and create a policy
const policy = trustedTypes.createPolicy('escapePolicy', {
createHTML: str => {
return str.replace(/\</g, '<').replace(/>/g, '>');
}
});
}
// Assignment of raw strings is blocked by Trusted Types.
el.innerHTML = 'some string'; // This throws an exception.
// Assignment of Trusted Types is accepted safely.
const escaped = policy.createHTML('<img src=x onerror=alert(1)>');
el.innerHTML = escaped; // '&lt;img src=x onerror=alert(1)&gt;'
Các trường hợp sử dụng được đề xuất
-
Thực thi Trusted Types cho các nguồn DOM nguy hiểm Tiêu đề CSP và Trusted Types:
Content-Security-Policy: require-trusted-types-for 'script'Hiện tại,
'script'là giá trị duy nhất được chấp nhận cho chỉ thịrequire-trusted-types-for.Tất nhiên, bạn có thể kết hợp Trusted Types với các chỉ thị CSP (Chính sách bảo mật nội dung) khác:
Hợp nhất CSP dựa trên số chỉ dùng một lần ở trên với Trusted Types:
Content-Security-Policy:
script-src 'nonce-{RANDOM1}' 'strict-dynamic' https: 'unsafe-inline';
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
<aside class="note"><b>Lưu ý: </b> Bạn có thể giới hạn tên chính sách Trusted Types được phép bằng cách đặt một chỉ thị <code>trusted-types</code> bổ sung (ví dụ: <code>trusted-types myPolicy</code>). Tuy nhiên, đây không phải là yêu cầu bắt buộc. </aside>
-
Xác định chính sách
Chính sách:
// Feature detection if (window.trustedTypes && trustedTypes.createPolicy) { // Name and create a policy const policy = trustedTypes.createPolicy('escapePolicy', { createHTML: str => { return str.replace(/\/g, '>'); } }); }
-
Áp dụng chính sách
Sử dụng chính sách khi ghi dữ liệu vào DOM:
// Assignment of raw strings are blocked by Trusted Types. el.innerHTML = 'some string'; // This throws an exception.</p> <p>// Assignment of Trusted Types is accepted safely. const escaped = policy.createHTML('<img src="x" onerror="alert(1)">'); el.innerHTML = escaped; // '<img src=x onerror=alert(1)>'
Với
require-trusted-types-for 'script', bạn bắt buộc phải sử dụng một loại đáng tin cậy. Việc sử dụng bất kỳ DOM API nguy hiểm nào với một chuỗi sẽ dẫn đến lỗi.
Các trình duyệt được hỗ trợ
Tìm hiểu thêm
- Ngăn chặn các lỗ hổng tập lệnh trên nhiều trang web dựa trên DOM bằng Trusted Types
- CSP: require-trusted-types-for – HTTP | MDN
- CSP: trusted-types – HTTP | MDN
- Bản minh hoạ Trusted Types – mở Trình kiểm tra Công cụ cho nhà phát triển và xem điều gì đang xảy ra
X-Content-Type-Options
Khi một tài liệu HTML độc hại được phân phát từ miền của bạn (ví dụ: nếu một hình ảnh được tải lên một dịch vụ ảnh có chứa mã đánh dấu HTML hợp lệ), một số trình duyệt sẽ coi đó là một tài liệu đang hoạt động và cho phép tài liệu đó thực thi tập lệnh trong bối cảnh của ứng dụng, dẫn đến lỗi tập lệnh trên nhiều trang web.
X-Content-Type-Options: nosniff ngăn chặn điều này bằng cách hướng dẫn trình duyệt rằng loại MIME được đặt trong tiêu đề Content-Type cho một phản hồi nhất định là chính xác. Bạn nên dùng tiêu đề này cho tất cả tài nguyên.
Ví dụ về cách sử dụng
X-Content-Type-Options: nosniff
Các trường hợp sử dụng được đề xuất
X-Content-Type-Options: nosniff được đề xuất cho tất cả tài nguyên được phân phát từ máy chủ của bạn cùng với tiêu đề Content-Type chính xác.
Ví dụ về tiêu đề được gửi cùng với HTML của tài liệu
X-Content-Type-Options: nosniff Content-Type: text/html; charset=utf-8
Các trình duyệt được hỗ trợ
Tìm hiểu thêm
X-Frame-Options
Nếu một trang web độc hại có thể nhúng trang web của bạn dưới dạng iframe, điều này có thể cho phép kẻ tấn công thực hiện các hành động không mong muốn của người dùng bằng cách tấn công bằng cách nhấp chuột giả mạo. Ngoài ra, trong một số trường hợp, các cuộc tấn công kiểu Spectre tạo cơ hội cho các trang web độc hại tìm hiểu về nội dung của một tài liệu được nhúng.
X-Frame-Options cho biết liệu trình duyệt có được phép kết xuất một trang trong <frame>, <iframe>, <embed> hoặc <object> hay không. Tất cả tài liệu đều nên gửi tiêu đề này để cho biết liệu chúng có cho phép các tài liệu khác nhúng hay không.
Ví dụ về cách sử dụng
X-Frame-Options: DENY
Các trường hợp sử dụng được đề xuất
Tất cả những tài liệu không được thiết kế để nhúng đều phải sử dụng tiêu đề X-Frame-Options.
Bạn có thể thử xem các cấu hình sau đây ảnh hưởng như thế nào đến việc tải một iframe trên bản minh hoạ này. Thay đổi trình đơn thả xuống X-Frame-Options và nhấp vào nút Tải lại iframe.
Bảo vệ trang web của bạn khỏi bị nhúng bởi bất kỳ trang web nào khác
Từ chối bị nhúng bởi bất kỳ tài liệu nào khác.
X-Frame-Options: DENYBảo vệ trang web của bạn khỏi bị nhúng bởi bất kỳ trang web nào trên nhiều nguồn gốc
Chỉ cho phép các tài liệu cùng nguồn gốc nhúng.
X-Frame-Options: SAMEORIGINCác trình duyệt được hỗ trợ
Tìm hiểu thêm
Chính sách về tài nguyên trên nhiều nguồn gốc (CORP)
Kẻ tấn công có thể nhúng các tài nguyên từ một nguồn gốc khác, chẳng hạn như từ trang web của bạn, để tìm hiểu thông tin về các tài nguyên đó bằng cách khai thác lỗ hổng rò rỉ trên nhiều trang web dựa trên nền tảng web.
Cross-Origin-Resource-Policy giảm thiểu rủi ro này bằng cách cho biết nhóm trang web mà nó có thể được tải. Tiêu đề này có một trong ba giá trị: same-origin, same-site và cross-origin. Tất cả tài nguyên đều được đề xuất gửi tiêu đề này để cho biết liệu chúng có cho phép các trang web khác tải hay không.
Ví dụ về cách sử dụng
Cross-Origin-Resource-Policy: same-origin
Các trường hợp sử dụng được đề xuất
Bạn nên phân phát tất cả tài nguyên bằng một trong 3 tiêu đề sau.
Bạn có thể thử nghiệm xem các cấu hình sau ảnh hưởng như thế nào đến việc tải tài nguyên trong môi trường Cross-Origin-Embedder-Policy: require-corp trên bản minh hoạ này. Thay đổi trình đơn thả xuống Cross-Origin-Resource-Policy (Chính sách tài nguyên trên nhiều nguồn) rồi nhấp vào nút Reload the iframe (Tải lại iframe) hoặc Reload the image (Tải lại hình ảnh) để xem hiệu ứng.
Cho phép tải tài nguyên cross-origin
Bạn nên áp dụng cross-origin cho các tài nguyên (vì các tài nguyên này thường được tải bởi các trang có nguồn gốc chéo), trừ phi các tài nguyên đó đã được phân phát thông qua CORS (có hiệu ứng tương tự).
Cross-Origin-Resource-Policy: cross-originGiới hạn số lượng tài nguyên được tải từ same-origin
Bạn chỉ nên áp dụng same-origin cho những tài nguyên mà các trang cùng nguồn gốc dự định tải. Bạn nên áp dụng điều này cho những tài nguyên có chứa thông tin nhạy cảm về người dùng hoặc các phản hồi của một API chỉ được gọi từ cùng một nguồn.
Xin lưu ý rằng các tài nguyên có tiêu đề này vẫn có thể được tải trực tiếp, chẳng hạn như bằng cách chuyển đến URL trong một cửa sổ trình duyệt mới. Chính sách tài nguyên trên nhiều nguồn gốc chỉ bảo vệ tài nguyên khỏi bị các trang web khác nhúng.
Cross-Origin-Resource-Policy: same-originGiới hạn số lượng tài nguyên được tải từ same-site
Bạn nên áp dụng same-site cho những tài nguyên tương tự như ở trên nhưng được dự định tải bởi các miền con khác của trang web.
Cross-Origin-Resource-Policy: same-siteCác trình duyệt được hỗ trợ
Tìm hiểu thêm
Chính sách Cross-Origin-Opener-Policy (COOP)
Trang web của kẻ tấn công có thể mở một trang web khác trong cửa sổ bật lên để tìm hiểu thông tin về trang web đó bằng cách khai thác lỗ hổng rò rỉ trên nhiều trang web dựa trên web. Trong một số trường hợp, điều này cũng có thể cho phép khai thác các cuộc tấn công kênh phụ dựa trên Spectre.
Tiêu đề Cross-Origin-Opener-Policy cung cấp một cách để tài liệu tự tách biệt khỏi các cửa sổ trên nhiều nguồn gốc được mở thông qua window.open() hoặc một đường liên kết có target="_blank" mà không có rel="noopener". Do đó, mọi đối tượng mở chéo nguồn của tài liệu sẽ không có thông tin tham chiếu đến tài liệu đó và sẽ không thể tương tác với tài liệu đó.
Ví dụ về cách sử dụng
Cross-Origin-Opener-Policy: same-origin-allow-popups
Các trường hợp sử dụng được đề xuất
Bạn có thể thử xem các cấu hình sau ảnh hưởng như thế nào đến việc giao tiếp với cửa sổ bật lên trên nhiều nguồn gốc trên bản minh hoạ này. Thay đổi trình đơn thả xuống Cross-Origin-Opener-Policy cho cả tài liệu và cửa sổ bật lên, nhấp vào nút Open a popup (Mở cửa sổ bật lên) rồi nhấp vào Send a postMessage (Gửi postMessage) để xem thông báo có thực sự được gửi hay không.
Cách ly tài liệu khỏi các cửa sổ trên nhiều nguồn gốc
Chế độ cài đặt same-origin sẽ tách riêng tài liệu khỏi các cửa sổ tài liệu trên nhiều nguồn gốc.
Cross-Origin-Opener-Policy: same-originTách biệt một tài liệu khỏi các cửa sổ trên nhiều nguồn gốc nhưng cho phép cửa sổ bật lên
Việc đặt same-origin-allow-popups cho phép một tài liệu giữ lại thông tin tham chiếu đến các cửa sổ bật lên của tài liệu đó, trừ phi các cửa sổ đó đặt COOP bằng same-origin hoặc same-origin-allow-popups. Điều này có nghĩa là same-origin-allow-popups vẫn có thể bảo vệ tài liệu khỏi bị tham chiếu khi được mở dưới dạng cửa sổ bật lên, nhưng cho phép tài liệu đó giao tiếp với các cửa sổ bật lên của riêng nó.
Cross-Origin-Opener-Policy: same-origin-allow-popupsCho phép các cửa sổ trên nhiều nguồn gốc tham chiếu đến một tài liệu
unsafe-none là giá trị mặc định nhưng bạn có thể chỉ rõ rằng cửa sổ nhiều nguồn gốc có thể mở tài liệu này và vẫn giữ được quyền truy cập lẫn nhau.
Cross-Origin-Opener-Policy: unsafe-noneCác mẫu báo cáo không tương thích với COOP
Bạn có thể nhận được báo cáo khi COOP ngăn chặn các lượt tương tác giữa các cửa sổ bằng API Báo cáo.
Cross-Origin-Opener-Policy: same-origin; report-to="coop"COOP cũng hỗ trợ chế độ chỉ báo cáo để bạn có thể nhận báo cáo mà không thực sự chặn giao tiếp giữa các tài liệu trên nhiều nguồn.
Cross-Origin-Opener-Policy-Report-Only: same-origin; report-to="coop"Các trình duyệt được hỗ trợ
Tìm hiểu thêm
Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS)
Không giống như các mục khác trong bài viết này, Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS) không phải là một tiêu đề mà là một cơ chế của trình duyệt yêu cầu và cho phép truy cập vào tài nguyên trên nhiều nguồn gốc.
Theo mặc định, các trình duyệt sẽ thực thi chính sách cùng nguồn gốc để ngăn trang web truy cập vào các tài nguyên có nguồn gốc khác. Ví dụ: khi một hình ảnh từ nhiều nguồn được tải, mặc dù hình ảnh đó xuất hiện trên trang web một cách trực quan, nhưng JavaScript trên trang không có quyền truy cập vào dữ liệu của hình ảnh. Nhà cung cấp tài nguyên có thể nới lỏng các hạn chế và cho phép các trang web khác đọc tài nguyên bằng cách chọn sử dụng CORS.
Ví dụ về cách sử dụng
Access-Control-Allow-Origin: https://example.com
Access-Control-Allow-Credentials: true
Trước khi tìm hiểu cách định cấu hình CORS, bạn nên hiểu rõ sự khác biệt giữa các loại yêu cầu. Tuỳ thuộc vào thông tin chi tiết của yêu cầu, yêu cầu sẽ được phân loại là yêu cầu đơn giản hoặc yêu cầu trước khi gửi.
Tiêu chí cho một yêu cầu đơn giản:
- Phương thức này là
GET,HEADhoặcPOST. - Tiêu đề tuỳ chỉnh chỉ bao gồm
Accept,Accept-Language,Content-LanguagevàContent-Type. Content-Typelàapplication/x-www-form-urlencoded,multipart/form-datahoặctext/plain.
Mọi thứ khác đều được phân loại là yêu cầu trước khi thực hiện. Để biết thêm thông tin chi tiết, hãy xem bài viết Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS) – HTTP | MDN.
Các trường hợp sử dụng được đề xuất
Yêu cầu đơn giản
Khi một yêu cầu đáp ứng các tiêu chí của yêu cầu đơn giản, trình duyệt sẽ gửi một yêu cầu trên nhiều nguồn gốc có tiêu đề Origin cho biết nguồn gốc yêu cầu.
Ví dụ về tiêu đề của yêu cầu
Get / HTTP/1.1 Origin: https://example.com
Ví dụ về tiêu đề phản hồi
Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Credentials: true
Access-Control-Allow-Origin: https://example.comcho biết rằnghttps://example.comcó thể truy cập vào nội dung của phản hồi. Tài nguyên mà mọi trang web đều có thể đọc được có thể đặt tiêu đề này thành*. Trong trường hợp đó, trình duyệt sẽ chỉ yêu cầu thực hiện yêu cầu mà không cần thông tin xác thực.Access-Control-Allow-Credentials: truecho biết những yêu cầu mang thông tin đăng nhập (cookie) được phép tải tài nguyên. Nếu không, các yêu cầu đã xác thực sẽ bị từ chối ngay cả khi nguồn yêu cầu có trong tiêu đềAccess-Control-Allow-Origin.
Bạn có thể thử xem yêu cầu đơn giản ảnh hưởng đến việc tải tài nguyên như thế nào trong môi trường Cross-Origin-Embedder-Policy: require-corp trên bản minh hoạ này. Nhấp vào hộp đánh dấu chia sẻ tài nguyên trên nhiều nguồn gốc rồi nhấp vào nút Tải lại hình ảnh để xem hiệu ứng.
Yêu cầu kiểm tra trước
Yêu cầu trước khi gửi được đặt trước bằng một yêu cầu OPTIONS để kiểm tra xem yêu cầu tiếp theo có được phép gửi hay không.
Ví dụ về tiêu đề của yêu cầu
OPTIONS / HTTP/1.1 Origin: https://example.com Access-Control-Request-Method: POST Access-Control-Request-Headers: X-PINGOTHER, Content-Type
Access-Control-Request-Method: POSTcho phép thực hiện yêu cầu sau bằng phương thứcPOST.Access-Control-Request-Headers: X-PINGOTHER, Content-Typecho phép bên yêu cầu đặt tiêu đề HTTPX-PINGOTHERvàContent-Typetrong yêu cầu tiếp theo.
Ví dụ về tiêu đề phản hồi
Access-Control-Allow-Origin: https://example.com Access-Control-Allow-Credentials: true Access-Control-Allow-Methods: POST, GET, OPTIONS Access-Control-Allow-Headers: X-PINGOTHER, Content-Type Access-Control-Max-Age: 86400
Access-Control-Allow-Methods: POST, GET, OPTIONScho biết rằng các yêu cầu tiếp theo có thể được thực hiện bằng các phương thứcPOST,GETvàOPTIONS.Access-Control-Allow-Headers: X-PINGOTHER, Content-Typecho biết các yêu cầu tiếp theo có thể bao gồm tiêu đềX-PINGOTHERvàContent-Type.Access-Control-Max-Age: 86400cho biết kết quả của yêu cầu được kiểm tra trước có thể được lưu vào bộ nhớ đệm trong 86400 giây.
Các trình duyệt được hỗ trợ
Tìm hiểu thêm
Chính sách đối với trình nhúng trên nhiều nguồn gốc (COEP)
Để giảm khả năng các cuộc tấn công dựa trên Spectre đánh cắp tài nguyên trên nhiều nguồn, các tính năng như SharedArrayBuffer hoặc performance.measureUserAgentSpecificMemory() sẽ bị tắt theo mặc định.
Cross-Origin-Embedder-Policy: require-corp ngăn các tài liệu và trình chạy tải tài nguyên nhiều nguồn gốc như hình ảnh, tập lệnh, biểu định kiểu, iframe và các tài nguyên khác, trừ phi các tài nguyên này chọn tải rõ ràng thông qua tiêu đề CORS hoặc CORP. Bạn có thể kết hợp COEP với Cross-Origin-Opener-Policy để chọn sử dụng chế độ tách biệt nhiều nguồn gốc cho một tài liệu.
Sử dụng Cross-Origin-Embedder-Policy: require-corp khi bạn muốn bật tính năng tách biệt nhiều nguồn gốc cho tài liệu của mình.
Ví dụ về cách sử dụng
Cross-Origin-Embedder-Policy: require-corp
Ví dụ về cách sử dụng
COEP nhận một giá trị duy nhất là require-corp. Bằng cách gửi tiêu đề này, bạn có thể hướng dẫn trình duyệt chặn tải các tài nguyên không chọn sử dụng thông qua CORS hoặc CORP.
Bạn có thể thử xem các cấu hình sau đây ảnh hưởng như thế nào đến việc tải tài nguyên trên bản minh hoạ này. Thay đổi trình đơn thả xuống Cross-Origin-Embedder-Policy, trình đơn thả xuống Cross-Origin-Resource-Policy, hộp đánh dấu Report Only (Chỉ báo cáo), v.v. để xem những thay đổi này ảnh hưởng như thế nào đến việc tải tài nguyên. Ngoài ra, hãy mở bản minh hoạ điểm cuối báo cáo để xem các tài nguyên bị chặn có được báo cáo hay không.
Bật tính năng cách ly nhiều nguồn gốc
Bật tính năng tách biệt nhiều nguồn gốc bằng cách gửi Cross-Origin-Embedder-Policy: require-corp cùng với Cross-Origin-Opener-Policy: same-origin.
Cross-Origin-Embedder-Policy: require-corp Cross-Origin-Opener-Policy: same-origin
Báo cáo tài nguyên không tương thích với COEP
Bạn có thể nhận báo cáo về các tài nguyên bị chặn do COEP bằng Reporting API.
Cross-Origin-Embedder-Policy: require-corp; report-to="coep"COEP cũng hỗ trợ chế độ chỉ báo cáo để bạn có thể nhận báo cáo mà không thực sự chặn các tài nguyên tải.
Cross-Origin-Embedder-Policy-Report-Only: require-corp; report-to="coep"Các trình duyệt được hỗ trợ
Tìm hiểu thêm
Bảo mật truyền tải nghiêm ngặt HTTP (HSTS)
Thông tin liên lạc qua kết nối HTTP thuần tuý không được mã hoá, khiến những kẻ nghe lén ở cấp độ mạng có thể truy cập vào dữ liệu được truyền.
Tiêu đề Strict-Transport-Security thông báo cho trình duyệt rằng trình duyệt không bao giờ được tải trang web bằng HTTP mà phải sử dụng HTTPS. Sau khi được đặt, trình duyệt sẽ sử dụng HTTPS thay vì HTTP để truy cập vào miền mà không cần chuyển hướng trong khoảng thời gian được xác định trong tiêu đề.
Ví dụ về cách sử dụng
Strict-Transport-Security: max-age=31536000
Các trường hợp sử dụng được đề xuất
Tất cả trang web chuyển từ HTTP sang HTTPS đều phải phản hồi bằng tiêu đề Strict-Transport-Security khi nhận được yêu cầu bằng HTTP.
Strict-Transport-Security: max-age=31536000Các trình duyệt được hỗ trợ