點選劫持防護
該 內容安全策略 frame-ancestors 指令和 X-Frame-Options 標頭控制網站如何在另一個網站上的 <iframe> 中嵌入。這些功能有助於防止點選劫持。
問題
解決方案
根據需要使用 HTTP 標頭
Content-Security-Policy: frame-ancestors是首選,因為它提供了對網站嵌入的更細粒度的控制。但是,它在 IE11 及更早版本、Chromium 版本之前的 Edge、Safari 9.1(桌面版)和 Safari 9.2(iOS 版)中不受支援。X-Frame-Options的粒度較低,但它在上面列出的舊版瀏覽器中受支援。
建議同時使用兩者,除非您知道不需要支援舊版瀏覽器。
除非您確實需要,否則應拒絕所有嵌入您網站的嘗試。當需要嵌入時,請提供必要的最小嵌入許可權。需要在 <iframe> 中嵌入的網站必須使用 JavaScript 防禦和強大的 Content-Security-Policy 來防止來自惡意來源的點選劫持。 Window.confirm() 可用作 JavaScript 防禦的一部分,以通知使用者他們即將執行的操作:請參閱 window.confirm() 保護。
每個設定的等效選項如下所示
| CSP 值 | X-Frame-Options 值 |
描述 |
|---|---|---|
frame-ancestors 'none' |
DENY |
拒絕所有嵌入嘗試。 |
frame-ancestors 'self' |
SAMEORIGIN |
僅允許同源嵌入嘗試。 |
frame-ancestors https://example.org |
ALLOWFROM https://example.org |
允許來自指定域的嵌入嘗試。 |
注意:X-Frame-Options: ALLOWFROM https://example.org 語法已棄用,大多數瀏覽器都會忽略它。建議在這種情況下改為設定 DENY,和/或依賴於 CSP 等效項。
注意:使用 SameSite 指令設定 Cookie 在依賴於使用者身份驗證的點選劫持情況下也很有用。
示例
使用 X-Frame-Options 和 CSP 阻止網站被嵌入
http
Content-Security-Policy: frame-ancestors 'none'
X-Frame-Options: DENY
僅允許在同源頁面上嵌入網站
http
Content-Security-Policy: frame-ancestors 'self'
X-Frame-Options: SAMEORIGIN
僅允許 example.org 嵌入網站
http
Content-Security-Policy: frame-ancestors https://example.org
# Block embedding in browsers that don't support CSP2
X-Frame-Options: DENY
另請參閱
- 點選劫持防禦備忘單 在
owasp.org上 - 點選劫持攻擊及其預防方法 在
auth0.com上 (2020)