Tìm hiểu thêm về các tiêu đề có thể giữ an toàn cho trang web của bạn và tra cứu nhanh các thông tin quan trọng nhất.
Bài viết này liệt kê các 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 tài liệu này để tìm hiểu các tính năng bảo mật dựa trên nền tảng web, tìm hiểu cách triển khai các tính năng này trên trang web và làm tài liệu tham khảo khi bạn cần nhắc nhở.
- Tiêu đề bảo mật nên dùng cho các trang web xử lý dữ liệu nhạy cảm của người dùng:
- Chính sách bảo mật nội dung (CSP)
- Loại đáng tin cậy
- Tiêu đề bảo mật được đề xuất cho tất cả các trang web:
- X-Content-Type-Options
- X-Frame-Options
- Chính sách tài nguyên trên nhiều nguồn gốc (CORP)
- Chính sách về trình mở nhiều nguồn gốc (COOP)
- Bảo mật truyền tải nghiêm ngặt HTTP (HSTS)
- Tiêu đề bảo mật dành cho các trang web có các tính năng nâng cao:
- Chia sẻ tài nguyên trên nhiều nguồn gốc (CORS)
- Chính sách về trình nhúng trên nhiều nguồn gốc (COEP)
Trước khi tìm hiểu kỹ các 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 chèn thông tin
Lỗ hổng chèn quảng cáo phát sinh khi dữ liệu không đáng tin cậy mà ứ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à viết tập lệnh trên nhiều trang web (XSS) ở nhiều dạng, bao gồm XSS phản ánh, XSS được lưu trữ, XSS dựa trên DOM và các biến thể khác.
Lỗ hổng bảo mật XSS thường có thể cho phép kẻ tấn công truy cập đầy đủ 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 nguồn gốc web.
Biện pháp bảo vệ truyền thống chống lại thao tác chèn bao gồm sử dụng các hệ thống mẫu HTML tự động thoát một cách nhất quán, tránh sử dụng API JavaScript nguy hiểm và xử lý dữ liệu người dùng đúng cách bằng cách lưu trữ tệp tải lên trong một miền riêng 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 rủi ro bị chèn thông tin.
- Sử dụng Loại đáng tin cậy để thực thi quá trình dọn dẹp dữ liệu được chuyển vào các API JavaScript nguy hiểm.
- Sử dụng X-Content-Type-Options để ngăn trình duyệt hiểu sai các loại MIME của tài nguyên trang web, điều này có thể dẫn đến việc thực thi tập lệnh.
Tách biệt trang web của bạn với các trang web khác
Tính mở của web cho phép các trang web tương tác với nhau theo cách có thể vi phạm kỳ vọng bảo mật của ứng dụng. Điều này bao gồm việc đột ngột đưa ra các yêu cầu được 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 bảo mật phổ biến làm giảm khả năng tách biệt web bao gồm clickjacking, giả mạo yêu cầu trên nhiều trang web (CSRF), đưa tập lệnh vào nhiều trang web (XSSI) và các rò rỉ khác nhau trên nhiều trang web.
- Sử dụng X-Frame-Options để ngăn tài liệu của bạn bị nhúng vào trang web độc hại.
- Hãy sử dụng Chính sách tài nguyên trên nhiều nguồn gốc (CORP) để ngăn việc một trang web có nhiều nguồn gốc đưa tài nguyên của trang web vào.
- Hãy sử dụng Chính sách về trình mở nhiều nguồn gốc (COOP) để bảo vệ cửa sổ trên trang web của bạn khỏi hành vi tương tác của các trang web độc hại.
- Sử dụng tính nă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ừ tài liệu trên nhiều nguồn gốc.
Bạn nên đọc Post-Spectre Web Development (Phát triển web sau bóng ma) nếu quan tâm đến các tiêu đề này.
Xây dựng trang web mạnh mẽ một cách bảo mật
Spectre đặt mọi dữ liệu được tải vào cùng một nhóm ngữ cảnh duyệt web (có thể đọc được) mặc dù có chính sách cùng nguồn gốc. Các trình duyệt hạn chế các tính năng có thể khai thác lỗ hổng bảo mật trong một môi trường đặc biệt có tên là "cách ly nhiều nguồn gốc". Với tính năng tách biệt 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 về trình nhúng trên nhiều nguồn gốc (COEP) cùng với COOP để cho phép tính năng tách biệt nhiều nguồn gốc.
Mã hoá lưu lượng truy cập vào trang web của bạn
Vấn đề 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 trộm tìm hiểu về hoạt động tương tác của người dùng với ứng dụng.
Không có đủ lớp mã hoá trong các trường hợp sau: không sử dụng HTTPS, nội dung hỗn hợp, đặt cookie mà không có thuộc tính Secure
(hay tiền tố __Secure
) hoặc logic xác thực CORS (logic) linh hoạt.
- Sử dụng Bảo mật truyền tải nghiêm ngặt HTTP (HSTS) để phân phát nội dung của bạn 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à phương thức tấn công trong đó một lỗ hổng bảo mật trên trang web cho phép chèn và thực thi tập lệnh độc hại.
Content-Security-Policy
cung cấp một lớp bổ sung để 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 có thể được trang 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, chẳng hạn như nếu đó là một ứng dụng trang đơn, hãy 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ách sử dụng được đề xuất
1. Sử dụng một 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 một giá trị số chỉ dùng một lần của 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 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ụ phù hợp 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ông cụ cho nhà phát triển.
2. Sử dụng một 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 được lưu vào bộ nhớ đệm, chẳng hạn như khi bạn đang tạo một ứng dụng trang đơn, hãy dùng một 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 cần phải chèn các tập lệnh cùng dòng để á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 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 nguồn một cách linh động" trong mục Lựa chọn B: Tiêu đề phản hồi của CSP dựa trên hàm băm.
Trình đánh giá CSP là một công cụ tốt để đánh giá CSP của bạn, nhưng đồng thời là một ví dụ chính xác 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ông cụ cho nhà phát triển.
Các trình duyệt được hỗ trợ
Những điều khác cần lưu ý về CSP
- Lệnh
frame-ancestors
bảo vệ trang web của bạn khỏi hành vi tấn công giả mạo – một rủi ro xảy ra 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ể sử dụngX-Frame-Options
để chặn hoạt động tải, nhưngframe-ancestors
cung cấp cho bạn cấu hình nâng cao để chỉ cho phép một số nguồn gốc cụ thể dưới dạng trình nhúng. - Có thể bạn đã 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: hiện 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 này 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
XSS dựa trên DOM là cuộc tấn công trong đó dữ liệu độc hại được chuyển vào bồn lưu trữ dữ liệu hỗ trợ việc thực thi mã động, chẳng hạn như eval()
hoặc .innerHTML
.
Loại đáng tin cậy cung cấp công cụ để viết, đánh giá tính bảo mật và duy trì ứng dụng không dùng DOM XSS. Bạn có thể bật các lớp này qua CSP và bảo mật mã JavaScript theo mặc định 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 Loại đáng tin cậy.
Để 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 áp dụng nhất quán các quy tắc bảo mật (chẳng hạn như thoát hoặc dọn dẹp) trước khi ghi dữ liệu vào DOM. Khi đó, các chính sách này là nơi duy nhất trong mã có khả năng triển khai 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ách sử dụng được đề xuất
-
Thực thi các Loại đáng tin cậy cho các bồn lưu trữ DOM nguy hiểm Tiêu đề CSP và Loại đáng tin cậy:
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 lệnhrequire-trusted-types-for
.Tất nhiên, bạn có thể kết hợp các Loại đáng tin cậy với các lệnh CSP khác:
Hợp nhất CSP dựa trên số chỉ dùng một lần ở trên với Các loại đáng tin cậy:
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 các tên chính sách Loại đáng tin cậy được phép bằng cách đặt thêm lệnh <code>trusted-types</code> (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 này 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 loại đáng tin cậy. Việc sử dụng bất kỳ API DOM nguy hiểm nào kèm theo 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
- Dùng các Loại đáng tin cậy để ngăn chặn lỗ hổng bảo mật tập lệnh trên nhiều trang web dựa trên DOM
- CSP: required-trusted-types-for – HTTP | MDN
- CSP: loại đáng tin cậy – HTTP |
MDN
- Bản minh hoạ Loại đáng tin cậy – 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 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à tài liệu đang hoạt động và cho phép tài liệu đó thực thi tập lệnh theo ngữ 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 đã đặ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 của bạn.
Ví dụ về cách sử dụng
X-Content-Type-Options: nosniff
Cách sử dụng được đề xuất
Bạn nên sử dụng X-Content-Type-Options: nosniff
cho tất cả các tài nguyên do máy chủ của bạn phân phát cùng với tiêu đề Content-Type
chính xác.
Tiêu đề mẫ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
Tuỳ chọn X-Frame
Nếu một trang web độc hại có thể nhúng trang web của bạn dưới dạng iframe, thì điều này có thể cho phép kẻ tấn công gọi ra các hành động ngoài ý muốn của người dùng bằng cách clickjacking. Ngoài ra, trong một số trường hợp, các cuộc tấn công loại Spectre cho phép các trang web độc hại có cơ hội tìm hiểu về nội dung của tài liệu được nhúng.
X-Frame-Options
cho biết liệu trình duyệt có được phép hiển thị một trang ở <frame>
, <iframe>
, <embed>
hay <object>
hay không. Bạn nên gửi tiêu đề này Tất cả tài liệu để cho biết liệu các tài liệu đó 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ách sử dụng được đề xuất
Tất cả 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 tác động như thế nào đến quá trình tải iframe trong bản minh hoạ
này. Thay đổi trình đơn thả xuống X-Frame-Options
rồi nhấp vào nút Tải lại iframe.
Bảo vệ trang web của bạn không bị nhúng bởi bất kỳ trang web nào khác
Từ chối việc được nhúng bởi bất kỳ tài liệu nào khác.
X-Frame-Options: DENY
Bảo vệ trang web của bạn không bị nhúng bởi bất kỳ trang web nhiều nguồn gốc nào
Chỉ cho phép nhúng đối với các tài liệu có cùng nguồn gốc.
X-Frame-Options: SAMEORIGIN
Cá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 tài nguyên từ một nguồn 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 sự cố rò rỉ trên nhiều trang web.
Cross-Origin-Resource-Policy
giảm thiểu rủi ro này bằng cách cho biết tập hợp các trang web có thể tải. Tiêu đề này có một trong ba giá trị: same-origin
, same-site
và cross-origin
. Bạn nên gửi tất cả tài nguyên để gửi tiêu đề này để cho biết liệu các trang web khác có cho phép tải tiêu đề này hay không.
Ví dụ về cách sử dụng
Cross-Origin-Resource-Policy: same-origin
Cách sử dụng được đề xuất
Bạn nên phân phát tất cả các tài nguyên có một trong ba tiêu đề sau.
Bạn có thể thử 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 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 quả.
Cho phép tải tài nguyên cross-origin
Các dịch vụ giống như CDN 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 nhiều nguồn gốc), trừ phi các tài nguyên này đã được phân phát thông qua CORS có tác động tương tự.
Cross-Origin-Resource-Policy: cross-origin
Giới hạn tài nguyên được tải từ same-origin
Bạn nên áp dụng same-origin
cho các tài nguyên chỉ tải bằng các trang có cùng nguồn gốc. Bạn nên áp dụng cách này cho các tài nguyên chứa thông tin nhạy cảm về người dùng hoặc phản hồi của một API chỉ được gọi từ cùng một nguồn gốc.
Xin lưu ý rằng bạn vẫn có thể tải trực tiếp các tài nguyên có tiêu đề này, 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ông bị các trang web khác nhúng vào.
Cross-Origin-Resource-Policy: same-origin
Giới hạn 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 sẽ do các miền con khác của trang web tải.
Cross-Origin-Resource-Policy: same-site
Các trình duyệt được hỗ trợ
Tìm hiểu thêm
Chính sách về cơ chế mở cho nhiều nguồn gốc (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 sự cố rò rỉ trên nhiều trang web trên web. Trong một số trường hợp, việc này cũng có thể cho phép khai thác các cuộc tấn công kênh bên 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 riêng
vớ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 với
target="_blank"
mà không có rel="noopener"
. Do đó, mọi trình mở nhiều nguồn gốc của tài liệu sẽ không 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ách 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 hoạt động giao tiếp thông qua cửa sổ bật lê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 tài liệu và cửa sổ bật lên, nhấp vào nút Open a windows (Mở cửa sổ bật lên), sau đó nhấp vào Send a postMessage để xem tin nhắn có thực sự được gửi hay không.
Tách biệt tài liệu với các cửa sổ trên nhiều nguồn gốc
Việc đặt same-origin
sẽ đặt tài liệu được tách biệt với các cửa sổ tài liệu
trên nhiều nguồn gốc.
Cross-Origin-Opener-Policy: same-origin
Tách biệt tài liệu khỏi các cửa sổ 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
sẽ cho phép tài liệu giữ lại thông tin tham chiếu đến cửa sổ bật lên, trừ phi tài liệu đó đặt COOP bằng same-origin
hoặc same-origin-allow-popups
. Tức là same-origin-allow-popups
vẫn có thể bảo vệ tài liệu khỏi bị tham chiếu khi mở dưới dạng cửa sổ bật lên, nhưng cho phép giao tiếp với cửa sổ bật lên riêng.
Cross-Origin-Opener-Policy: same-origin-allow-popups
Cho phép tham chiếu tài liệu theo cửa sổ trên nhiều nguồn gốc
unsafe-none
là giá trị mặc định nhưng bạn có thể cho biết rõ rằng tài liệu này có thể được mở bằng một cửa sổ trên nhiều nguồn gốc và duy trì quyền truy cập lẫn nhau.
Cross-Origin-Opener-Policy: unsafe-none
Cá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 hoạt động tương tác giữa nhiều cửa sổ với 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 hoạt động giao tiếp giữa các tài liệu trên nhiều nguồn gốc.
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à tiêu đề, mà là một cơ chế trình duyệt yêu cầu và cho phép truy cập vào tài nguyê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 một trang web truy cập vào tài nguyên trên nhiều nguồn gốc. Ví dụ: khi hình ảnh trên nhiều nguồn gốc được tải, mặc dù hình ảnh đó hiển thị trực quan trên trang web, nhưng JavaScript trên trang sẽ 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 nắm được 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 về yêu cầu, một yêu cầu sẽ được phân loại là yêu cầu đơn giản hoặc yêu cầu đã được kiểm tra trước.
Tiêu chí cho một yêu cầu đơn giản:
- Phương thức này là
GET
,HEAD
hoặcPOST
. - Các tiêu đề tuỳ chỉnh chỉ bao gồm
Accept
,Accept-Language
,Content-Language
vàContent-Type
. Content-Type
làapplication/x-www-form-urlencoded
,multipart/form-data
hoặctext/plain
.
Mọi thứ khác đều được phân loại là yêu cầu được kiểm tra trước. Để 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ách sử dụng được đề xuất
Yêu cầu đơn giản
Khi một yêu cầu đáp ứng tiêu chí đơn giản về yêu cầu, trình duyệt sẽ gửi một yêu cầu nhiều nguồn gốc với 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.com
cho biếthttps://example.com
có thể truy cập vào nội dung phản hồi. Các tài nguyên mà mọi trang web đều có thể đọc được đều có thể đặt tiêu đề này thành*
. Trong trường hợp đó, trình duyệt sẽ chỉ cần đưa ra yêu cầu mà không cần thông tin xác thực.Access-Control-Allow-Credentials: true
cho biết rằng các yêu cầu chứa thông tin xác thực (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 gốc 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 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. Nhấp vào hộp đánh dấu Cross-Origin Resource sharing (Chia sẻ tài nguyên trên nhiều nguồn gốc) rồi nhấp vào nút Reload the image (Tải lại hình ảnh) để xem hiệu ứng.
Yêu cầu được kiểm tra trước
Trước một yêu cầu được kiểm tra trước là 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: POST
cho phép thực hiện yêu cầu sau đây bằng phương thứcPOST
.Access-Control-Request-Headers: X-PINGOTHER, Content-Type
cho phép người yêu cầu đặt các tiêu đề HTTPX-PINGOTHER
vàContent-Type
trong 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, OPTIONS
cho biết rằng bạn có thể đưa ra các yêu cầu tiếp theo bằng phương thứcPOST
,GET
vàOPTIONS
.Access-Control-Allow-Headers: X-PINGOTHER, Content-Type
cho biết các yêu cầu tiếp theo có thể bao gồm các tiêu đềX-PINGOTHER
vàContent-Type
.Access-Control-Max-Age: 86400
cho biết rằng 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 bóng ma đánh cắp tài nguyên nhiều nguồn gốc, 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 tài liệu và trình thực thi tải tài nguyên trên nhiều nguồn gốc như hình ảnh, tập lệnh, biểu định kiểu, iframe và các nội dung khác trừ phi các tài nguyên này chọn tải một cách 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 cho một tài liệu sử dụng tính năng tách biệt nhiều nguồn gốc.
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.
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
. Khi gửi tiêu đề này, bạn có thể hướng dẫn trình duyệt chặn các tài nguyên không chọn tham gia thông qua CORS hoặc CORP.
Bạn có thể thử 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 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-Embedder-Policy, hộp đánh dấu Cross-Origin-Embedder-Policy (Chỉ báo cáo), v.v. để xem mức độ ảnh hưởng của các chính sách này đối với 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 tách biệt 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 các 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 gây ra bằng API Báo cáo.
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 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)
Hoạt động giao tiếp qua kết nối HTTP thuần tuý không được mã hoá, khiến những kẻ theo dõi ở cấp độ mạng có thể truy cập vào dữ liệu được chuyển.
Tiêu đề Strict-Transport-Security
thông báo cho trình duyệt rằng không được tải
trang web bằng HTTP mà hãy sử dụng HTTPS. Sau khi bạn đặt xong, trình duyệt sẽ sử dụng HTTPS thay vì HTTP để truy cập vào miền mà không có lệnh 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ách sử dụng được đề xuất
Tất cả cá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 có HTTP.
Strict-Transport-Security: max-age=31536000
Các trình duyệt được hỗ trợ