X-XSS-Protection

非標準:此功能是非標準的,並且不在標準軌道上。請勿在面向 Web 的生產網站上使用它:它不會對每個使用者都起作用。實現之間也可能存在很大的不相容性,並且行為在未來可能會發生變化。

HTTP X-XSS-Protection 響應頭是 Internet Explorer、Chrome 和 Safari 的一項功能,當它們檢測到反射型跨站指令碼 ( XSS ) 攻擊時,會阻止頁面載入。當網站實施強大的 Content-Security-Policy 來停用內聯 JavaScript ('unsafe-inline') 時,在現代瀏覽器中,這些保護在很大程度上是不必要的。

警告:即使此功能可以保護尚未支援 CSP 的舊版 Web 瀏覽器的使用者,但在某些情況下,XSS 保護可能會在原本安全的網站中建立 XSS 漏洞。有關更多資訊,請參閱下面的部分。

注意

這意味著,如果您不需要支援舊版瀏覽器,建議您使用 Content-Security-Policy 且不允許多unsafe-inline 指令碼。

頭型別 響應頭
禁止的頭名稱

語法

http
X-XSS-Protection: 0
X-XSS-Protection: 1
X-XSS-Protection: 1; mode=block
X-XSS-Protection: 1; report=<reporting-uri>
0

停用 XSS 過濾。

1

啟用 XSS 過濾(通常是瀏覽器的預設設定)。如果檢測到跨站指令碼攻擊,瀏覽器將清理頁面(刪除不安全的部件)。

1; mode=block

啟用 XSS 過濾。瀏覽器不會清理頁面,而是如果檢測到攻擊則會阻止渲染頁面。

1; report=<reporting-URI> (僅限 Chromium)

啟用 XSS 過濾。如果檢測到跨站指令碼攻擊,瀏覽器將清理頁面並報告違規行為。這使用 CSP report-uri 指令的功能來發送報告。

由 XSS 過濾引起的漏洞

考慮以下網頁 HTML 程式碼片段

html
<script>
  var productionMode = true;
</script>
<!-- [...] -->
<script>
  if (!window.productionMode) {
    // Some vulnerable debug code
  }
</script>

如果瀏覽器不執行 XSS 過濾,則此程式碼是完全安全的。但是,如果瀏覽器執行 XSS 過濾並且搜尋查詢為 ?something=%3Cscript%3Evar%20productionMode%20%3D%20true%3B%3C%2Fscript%3E,則瀏覽器可能會執行頁面中的指令碼,忽略 <script>var productionMode = true;</script>(認為伺服器將其包含在響應中,因為它位於 URI 中),導致 window.productionMode 被評估為 undefined 並執行不安全的除錯程式碼。

X-XSS-Protection 標頭設定為 01; mode=block 可以防止上述漏洞。前者將使瀏覽器執行所有指令碼,而後者將完全阻止頁面被處理(儘管如果網站可以嵌入到 <iframe> 中,這種方法可能容易受到 側通道攻擊 的影響)。

示例

阻止檢測到反射型 XSS 攻擊時頁面載入。

http
X-XSS-Protection: 1; mode=block

PHP

php
header("X-XSS-Protection: 1; mode=block");

Apache (.htaccess)

apacheconf
<IfModule mod_headers.c>
  Header set X-XSS-Protection "1; mode=block"
</IfModule>

Nginx

nginx
add_header "X-XSS-Protection" "1; mode=block";

規範

不屬於任何規範或草案的一部分。

瀏覽器相容性

BCD 表格僅在瀏覽器中載入

另請參閱