Tomcat Servlet 設定同源政策
19 Oct 2017由於本次交付客戶的程式被要求要設定相關的參數,因此稍微研究了一下同源政策(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 *
總共有這幾種資源可以設定
defalut-src
:如果以下有東西沒設定就會讀取這個script-src
:關於 javascript 的部分style-src
:關於 css 的部分img-src
:關於圖片的部分
然後有這幾種設定值
*
:很好懂,全部放行的意思'self'
:只有跟自己同網域的資源才放行http://xxxx
: 指定某個網域放行,如我的範例就對 CDN 過來的 js 檔放行none
:全部禁止
除上述之外,CSP 還另外定義了一些跟 javascript 還有 CSS 有關的設定值
unsafe-inline
: 若你在script-src
跟style-src
沒有宣告這個選項,則你的該網頁預設會禁止使用 inline 程式碼,也就是以下這種寫法會無法執行
只能從外部引入 js 檔
CSS 檔同樣道理。
unsafe-eval
:eval()
是個超強的 function,所以也很危險。 與上面的一樣,若你沒有在script-src
宣告這個選項,則你的網頁會直接禁用eval()
綜合以上,重新檢視一下我的設定值
Content-Security-Policy :
default-src 'self';
script-src 'self' https://cdnjs.cloudflare.com 'unsafe-inline' 'unsafe-eval';
style-src 'self' 'unsafe-inline' ;
img-src *
- 預設只有同網域的資源可以載入
- script 的部分允許同網域、指定的 CDN 網址可以載入,並允許 inline-script & eval 函式
- css 的部分只允許同網域,並允許 inline-script
- 圖片的部分全部放行
備註
- 不同資源用
;
隔開 - 保留字要上單引號
- 網址不用加單引號
- 同一個資源的多個設定值用空格分開
2. 在 Tomcat Servlet 設定 header
簡單說明:
- 實作一個
javax.servlet.Filter
- 在他的
doFilter
方法內對ServletResponse
加料 - 在全域的
web.xml
檔宣告整個網站的子目錄皆適用此Filter
2-1 實作 Filter
2-2 在web.xml
宣告適用範圍
以上。