X-Frame-Options
這是為了防止IFrame式Clickjacking攻擊,Browser設定的一種規範
規範
資安議題
防止釣魚網站透過iframe來籤入自己的網站。並且在iframe上面埋一個隱形的DIV,欺騙使用者。 這是瀏覽器的安全防護特性之一,限制符合同源政策的網頁才能用IFrame、Frame或Object內嵌這個網頁。
防止網頁被內嵌目的在防止IFrame式Clickjacking攻擊(註:點擊刧持還有其他形式,本文只聚焦透過IFrame攻擊的手法),
避免惡意網頁將你的網頁疊加在一般按鈕或連結上方誘使使用者點擊,不知不覺完成開放權限、身份確認… 等操作。
隨便調查一下,發現不只Google,像Facebook、Twitter、Yahoo這些大網站也紛紛在HTTP Header加入X-Frame-Options: DENY或SAMEORIGIN。
釣魚網站的做法
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
body {
background-color: #0094ff;
}
button {
background-color: red;
color: yellow;
}
</style>
</head>
<body>
<button onclick="alert('我是豬頭')">我是豬頭</button>
</body>
</html>
某駭客黑大發現此網頁未加X-Frame-Options: DENY或SAMEORIGIN防護,心懷不軌搞了個陷阱網頁:先用IFrame內嵌豬頭偵測網頁,利用CSS技巧將IFrame設成position: absolute並調整位置,將「我是豬頭」按鈕蓋在「我是帥哥」按鈕的正上方,再調整CSS opacity透明度使之完全隱形(可參考影片裡的動畫示意)。
使用者只看到「我是帥哥」,按下去一秒變豬頭:
如何檢查
chrome
- F12打開Network
- 點選「Doc」尋找該網址的主要Document
- 點了後會出現詳細清單,選取「Header」
- 尋找「X-Frame-Options」
如何防止
如果希望整個網站都不准其他網頁內嵌,可以設定網站伺服器在Header中預設加入X-Frame-Options。
[ISS]
- Header設定
以IIS為例,可在HTTP回應標頭加入設定,或者使用web.config
HTTP
web.config
<system.webServer> <httpProtocol> <customHeaders> <add name="X-Frame-Options" value="SAMEORIGIN" /> </customHeaders> </httpProtocol> </system.webServer>
[Apache]
請加入以下指令到網站組態設定檔:
Header always append X-Frame-Options SAMEORIGIN
[nginx]
請加入以下指令到 http, server 或 location 組態設定檔:
add_header X-Frame-Options SAMEORIGIN;
[HAProxy]
請加入以下指令到 frontend, listen, 或 backend 組態設定檔:
rspadd X-Frame-Options:\ SAMEORIGIN
X-Frame-Options
參數說明:
- DENY
表示文件無論如何都不能被嵌入到 frame 中,即使是自家網站也不行。
- SAMEORIGIN
唯有當符合同源政策下,才能被嵌入到 frame 中。
- ALLOW-FROM uri
唯有列表許可的 URI 才能嵌入到 frame 中。
各瀏覽器處理結果
X-Frame-Options Header需要瀏覽器配合才有防護效果
chrome
IE
IE8以後才有
Firefox
當載入一個 X-Frame-Options 不允許的網站到 iframe 中, Firefox 會顯示about:blank 的空白頁面,甚至某些狀況還會顯示錯誤訊息。
參考
-
http://blog.darkthread.net/post-2016-06-12-iframe-clickjacking.aspx
同源政策 (same-origin policy):
http://www.ruanyifeng.com/blog/2016/04/same-origin-policy.html https://en.wikipedia.org/wiki/Same-origin_policy
新的規則: CSP , frame-ancestors
針對Cross Site Scripting這類攻擊,網頁安全有個新規格-CSP(Content Security Policy),
其中定義了 frame-ancestors 可取代 X-Frame-Options,但因為很多瀏覽器還不支援,現階段要防範網頁被內嵌仍是以 X-Frame-Options 為主。
https://developer.mozilla.org/en-US/docs/Web/Security/CSP/CSP_policy_directives#frame-ancestors
延伸閱讀
- JavaScript : Tutorial The Clickjacking attack, X-Frame-Options