客戶的資安檢查報告裡發現開發的網站沒有加入 x-frame-options 的設定值。
X-Frame-Options
共有三種值:
DENY
- 表示文件無論如何都不能被嵌入到 frame 中,即使是自家網站也不行。
SAMEORIGIN
- 唯有當符合同源政策下,才能被嵌入到 frame 中。
ALLOW-FROM uri
- 唯有列表許可的 URI 才能嵌入到 frame 中。
如果我們是使用 Tomcat 7.0.63 之後的版本可以直接修改 web.xml
<filter>
<filter-name>httpHeaderSecurity</filter-name>
<filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
<init-param>
<param-name>antiClickJackingOption</param-name>
<param-value>SAMEORIGIN</param-value>
</init-param>
</filter>
For filter-mapping part I have added.
<filter-mapping>
<filter-name>httpHeaderSecurity</filter-name>
<url-pattern>/*</url-pattern>
<dispatcher>REQUEST</dispatcher>
</filter-mapping>
如果是比較古老的舊版本,可以這樣子修改:
In Tomcat you need to use filters for that:
First, implement your own Filter
. Something like this:
public class XFrameHeaderFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException {
((HttpServletResponse) resp).setHeader("x-frame-options", "allow");
chain.doFilter(req, resp);
}
}
Second, make this filter a part of your web.xml:
<filter>
<filter-name>x-frame-header</filter-name>
<filter-class>XFrameHeaderFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>x-frame-header</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Apache 解法:
Step 1:
於Apache資料夾下,找檔名為http.conf的檔案
Step 2:
打開httpd.conf後,搜尋#LoadModule headers_module modules/mod_headers.so,並將#去掉
Step 3:
於httpd.con文件中新增下列內容
X-Frame-Options “SAMEORIGIN” -> 唯有當符合同源政策下,才能被嵌入到 frame 中。
Content-Security-Policy “default-src ‘self'” -> 只允許本站資源(CSP主要是在減少跨站腳本攻擊)
新增完成後,記得要重開Apache server設定才會套用上去
設定 nginx
請加入以下指令到 http, server 或 location 組態設定檔:
add_header X-Frame-Options
SAMEORIGIN;
設定 IIS
請加入以下指令到網站的 Web.config 檔:
<system.webServer>
...
<httpProtocol>
<customHeaders>
<add name="X-Frame-Options" value="SAMEORIGIN" />
</customHeaders>
</httpProtocol>
...
</system.webServer>
設定 HAProxy
請加入以下指令到 frontend, listen, 或 backend 組態設定檔:
rspadd X-Frame-Options:\ SAMEORIGIN
Note: 設定 Meta tag 是無效的,像是 <meta http-equiv=”X-Frame-Options” content=”deny”> 便沒有任何效果,只有透過設定 HTTP header 才有效果,請勿採用。