Tomcat Servlet 設定同源政策


由於本次交付客戶的程式被要求要設定相關的參數,因此稍微研究了一下同源政策(Same-origin policy)是啥,並記錄一下怎麼在tomcat伺服器上完成設定。

1. 同源政策 (Same-origin Policy)

簡介

MDN上關於同源政策的文件
同源政策指的是定義網頁上的程式碼可以使用那些網域的資料,包括.js檔,圖片資源,以及CSS文件都會被限制。

很容易理解的,同源政策的存在是為了防止跨網域攻擊XSS。簡單來說就是怕你不小心載入了別人的攻擊程式碼,乾脆限制只有我指定的某些網域的程式碼可以被執行 :D

設定方式

基本上設定方式都是在header加東西。由於我只被客戶要求要設定Content-Security-Policy,所以以下也只介紹這個XD

直接用我最後設定好的CSP當成範例吧:

Content-Security-Policy : default-src 'self';script-src 'self' https://cdnjs.cloudflare.com 'unsafe-inline' 'unsafe-eval';style-src 'self' 'unsafe-inline' ;img-src *

總共有這幾種資源可以設定

然後有這幾種設定值

除上述之外,CSP還另外定義了一些跟javascript還有CSS有關的設定值

<script type="text/javacript">
	console.log("這段無法執行~")
</script> 

只能從外部引入js檔

<script src="./your_code.js"></script>

CSS檔同樣道理。

綜合以上,重新檢視一下我的設定值

Content-Security-Policy : 
	default-src 'self';
	script-src 'self' https://cdnjs.cloudflare.com 'unsafe-inline' 'unsafe-eval';
	style-src 'self' 'unsafe-inline' ;
	img-src *

備註

2. 在Tomcat Servlet 設定 header

簡單說明:

  1. 實作一個javax.servlet.Filter
  2. 在他的doFilter方法內對ServletResponse加料
  3. 在全域的web.xml檔宣告整個網站的子目錄皆適用此Filter

2-1 實作Filter

public class MyFilter implements Filter {
  @Override
  public void doFilter(ServletRequest req, ServletResponse resp,
      FilterChain chain) throws IOException, ServletException {
    
    HttpServletRequest httpReq=(HttpServletRequest)req;
    HttpServletResponse httpResp=(HttpServletResponse)resp;
    httpResp.addHeader("Content-Security-Policy", "YOUR_CONFIGURE");
    chain.doFilter(httpReq, httpResp);
  }
}

2-2 在web.xml宣告適用範圍

<filter>
    <filter-name>CSP-Filter</filter-name>
    <filter-class>YOUR.PACKAGE.YOUR_FILTER</filter-class>
</filter>
<filter-mapping>
    <filter-name>CSP-Filter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

以上。

Hi 喜歡這篇文章的話 或許可以請我喝杯咖啡
Buy me a coffeeBuy me a coffee