內容安全策略Content Security Policy( CSP )
內容安全策略 (CSP) 是一個額外的安全層,用於檢測並削弱某些特定型別的攻擊,包括跨站指令碼 (XSS) 和資料注入攻擊等。無論是資料盜取、網站內容汙染還是散發惡意軟體,這些攻擊都是主要的手段。
CSP 被設計成完全向後相容(除CSP2 在向後相容有明確提及的不一致; 更多細節檢視這裡 章節1.1)。不支援CSP的瀏覽器也能與實現了CSP的伺服器正常合作,反之亦然:不支援 CSP 的瀏覽器只會忽略它,如常執行,預設為網頁內容使用標準的同源策略。如果網站不提供 CSP 頭部,瀏覽器也使用標準的同源策略。
為使CSP可用, 你需要配置你的網路伺服器返回 Content-Security-Policy HTTP頭部 ( 有時你會看到一些關於X-Content-Security-Policy頭部的提法, 那是舊版本,你無須再如此指定它)。
除此之外, 元素也可以被用來配置該策略, 例如
<meta http-equiv="Content-Security-Policy" content="default-src 'self'“>
CSP 的主要目標是減少和報告 XSS 攻擊 ,XSS 攻擊利用了瀏覽器對於從伺服器所獲取的內容的信任。惡意指令碼在受害者的瀏覽器中得以執行,因為瀏覽器信任其內容來源,即使有的時候這些指令碼並非來自於它本該來的地方。
CSP通過指定有效域——即瀏覽器認可的可執行指令碼的有效來源——使伺服器管理者有能力減少或消除XSS攻擊所依賴的載體。一個CSP相容的瀏覽器將會僅執行從白名單域獲取到的指令碼檔案,忽略所有的其他指令碼 (包括內聯指令碼和HTML的事件處理屬性)。
配置內容安全策略涉及到新增 Content-Security-Policy HTTP頭部到一個頁面,並配置相應的值,以控制使用者代理(瀏覽器等)可以為該頁面獲取哪些資源。比如一個可以上傳檔案和顯示圖片頁面,應該允許圖片來自任何地方,但限制表單的action屬性只可以賦值為指定的端點。一個經過恰當設計的內容安全策略應該可以有效的保護頁面免受跨站指令碼攻擊。
特別注意:如果不特別指定’unsafe-inline’時,頁面上所有inline的樣式和指令碼都不會執行;不特別指定’unsafe-eval’,頁面上不允許使用new Function,setTimeout,eval等方式執行動態程式碼。在限制了頁面資源來源之後,被XSS的風險確實小不少。
另外圖片是data:協議的 要用 img-src data:(記得加分號)
我的例子: 直接在過濾器新增攔截,給每個頁面加上對應頭部資訊
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
// 強制型別轉換 HttpServletRequest
HttpServletRequest request2 = (HttpServletRequest) request;
HttpServletResponse response2 = (HttpServletResponse)response;
//response2.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");
response2.addHeader("Content-Security-Policy", "default-src * data: 'unsafe-inline' 'unsafe-eval';img-src * data:;worker-src * blob:");
response2.addHeader("X-Content-Type-Options", "nosniff");
response2.addHeader("X-XSS-Protection", "1");
chain.doFilter(new XSSRequestWrapper(request2), response2);
}