1. 什麼是XSS攻擊?html
正常的頁面被滲出了攻擊者的js腳本,這些腳本能夠非法地獲取用戶信息,而後將信息發送到attacked的服務端。前端
XSS是須要充分利用輸出環境來構造攻擊腳本的git
2. 危害github
非法獲取用戶cookie、ip等內容web
竊取用戶輸入的內容express
劫持瀏覽器,造成DDOS攻擊瀏覽器
3. 類型安全
// 合法頁面 url: http://aa.com?test=1234 <input type="text" value={test} /> // result is: <input type="text" value="1234" /> // XSS攻擊 url: http://aa.com?test=" /><script>alert('xss')</script> <input type="text" value={test} /> // result is: <input type="text" value="" /> <script> alert('xss')</script> />
// input: <textarea> hello </div><script src="..."></script> </textarea> // 將hello及後面的內容一塊兒提交到服務上 //輸出上述內容 <div> hello</div><script src="..."></script> </div>
<div id="inner"></div> <script> var ele = document.querySelector('#inner'); var search = window.location.search; var age = getAge(search) // 獲取search中age的內容 ele.innerHTML = age; // if url: aa.com?age=23 <div id="inner">23</div> </script> // if url: aa.com?age=</div><script src="..."></script> <div id="inner"></div><script src="..."></script>
4.解決方案服務器
整體來說須要對HTML、Attribute、js context、URL、style context、JSON分別進行編碼處理。cookie
對html內容進行過濾,例如html purifier、js-xss
X-XSS-Protection
IE8+以上的瀏覽器均支持該http header,目前goole裏面已經添加該屬性:
x-xss-protection:1; mode=block
content security policy(CSP): W3C和各大瀏覽器廠商均推薦和實踐防護XSS的標準,限制執行、請求具備風險的外鏈資源,攻擊者沒法將目標信息傳出,並對relected XSS進行防護。
在HTTP的response中部署CSP,指定資源白名單來限制瀏覽器訪問未經容許的外部資源。
目前Google、facebook、twitter均支持該標準,例如twitter的配置信息:
content-security-policy:default-src https:; connect-src https:; font-src https: data:; frame-src https: twitter:; frame-ancestors 'self'; img-src https: blob: data:; media-src https: blob:; object-src https:; script-src 'unsafe-inline' 'nonce-w6FV5VZOKta+7JaW7PpR3A==' 'unsafe-eval' https:; style-src 'unsafe-inline' https:; report-uri https://twitter.com/i/csp_report?a=NVQWGYLXFVZXO2LGOQ%3D%3D%3D%3D%3D%3D&ro=false;
上述配置的詳細參數請參考CSP的相關規範,csp1.0,目前csp1.1草案已經出來。 然而,csp中不容許Eval、inline js、白名單獲取遠程腳本,這些阻礙着csp的推廣。
Template Engine:對處理輸出內容進行編碼,放置惡意代碼執行,對stored Xss進行防護。
例如常常使用handlebars就對輸出的內容進行了編碼:
Handlebars HTML-escapes values returned by a {{expression}}. If you don't want Handlebars to escape a value, use the "triple-stash", {{{. <div class="entry"> <h1>{{title}}</h1> <div class="body"> {{{body}}} </div> </div> { title: "All about <p> Tags", body: "<p>This is a post about <p> tags</p>" } result is as below: <div class="entry"> <h1>All About <p> Tags</h1> <div class="body"> <p>This is a post about <p> tags</p> </div> </div>
首先在服務端端,對輸出的內容進行編碼,對request中的內容進行檢查編碼。
在客戶端,對js獲取的widow.location、document.cookie等信息也須要相應處理。
5.參考
https://developer.mozilla.org/zh-CN/docs/Web/Security/CSP
http://www.80sec.com/browser-hijacking.html
http://www.freebuf.com/articles/web/40520.html