建設(shè)網(wǎng)站費(fèi)用多少錢新浪微輿情大數(shù)據(jù)平臺(tái)
XSS攻擊防御
- XSS Filter
- 過濾方法
- 輸入驗(yàn)證
- 數(shù)據(jù)凈化
- 輸出編碼
- 過濾方法
- Web安全編碼規(guī)范
XSS Filter
XSS Filter的作用是通過正則的方式對用戶(客戶端)請求的參數(shù)做腳本的過濾,從而達(dá)到防范XSS攻擊的效果。
XSS Filter作為防御跨站攻擊的主要手段之一,已經(jīng)廣泛應(yīng)用在各類Web系統(tǒng)之中,包括現(xiàn)今的許多應(yīng)用軟件,例如Chrome瀏覽器,通過加入XSS Filter功能可以有效防范所有非持久型的XSS攻擊攻擊。
過濾方法
防御跨站腳本攻擊的方式一般有兩種:Input Filtering和Output Filtering,分別在輸入端(Input)和輸出端(Output)進(jìn)行過濾,即輸入驗(yàn)證和輸出過濾。輸入驗(yàn)證是對輸入的所有數(shù)據(jù)都須經(jīng)過驗(yàn)證,驗(yàn)證所有輸入數(shù)據(jù)的長度、類型、語法以及業(yè)務(wù)規(guī)則,被確認(rèn)安全后才會(huì)存入數(shù)據(jù)庫中;輸出過濾在數(shù)據(jù)輸出前,確保用戶提交的數(shù)據(jù)被正確編碼,建議對所有字符進(jìn)行編碼而不僅局限于某個(gè)子集。應(yīng)用安全國際組織OWASP建議,防護(hù)XSS最佳的方法是結(jié)合輸入驗(yàn)證和輸出過濾。
- 輸入過濾:"永遠(yuǎn)不要相信用戶的輸入"是對設(shè)計(jì)人員和編碼人員說的,是進(jìn)行安全設(shè)計(jì)和安全編碼的重要準(zhǔn)則。換句話說,任何輸入數(shù)據(jù)在證明其無害之前,都是有害的。許多危險(xiǎn)的漏洞就是因?yàn)檫^于相信用戶的輸入是善意的而導(dǎo)致的。對輸入數(shù)據(jù)的過濾,具體可以從兩方面著手:輸入驗(yàn)證和數(shù)據(jù)凈化。
- 輸入驗(yàn)證:輸入驗(yàn)證是對輸入數(shù)據(jù)使用強(qiáng)類型檢查,驗(yàn)證數(shù)據(jù)的類型、長度、格式、范圍等。
- 數(shù)據(jù)凈化:數(shù)據(jù)凈化是為了使有潛在危害的數(shù)據(jù)變得安全。如果所允許的輸入范圍不能保證輸入數(shù)據(jù)的安全性,數(shù)據(jù)凈化就非常有用。數(shù)據(jù)凈化包括從刪除用戶輸入字符串后面的空格到去除值等一切行為。在 Web 應(yīng)用程序中,常見的數(shù)據(jù)凈化示例是使用 URL 編碼或HTML 編碼來包裝數(shù)據(jù),并將其作為文本而不是可執(zhí)行腳本來處理。
輸入驗(yàn)證
輸入驗(yàn)證要根據(jù)實(shí)際情況來設(shè)計(jì),下面是一些常見的檢測和過濾:
1、輸入是否僅僅包含合法的字符;
2、輸入字符串是否超過最大長度限制;
3、輸入如果為數(shù)字,數(shù)字是否在指定的范圍;
4、輸入是否符合特殊的格式要求,如E-mail地址、IP地址等。
而對于重要敏感的信息,如折扣、價(jià)格等,應(yīng)放到服務(wù)器端進(jìn)行傳參與校驗(yàn)等操作。
數(shù)據(jù)凈化
除了在客戶端驗(yàn)證數(shù)據(jù)的合法性,輸入過濾中還需要凈化有害的輸入,例如以下常見的敏感字符:
< > ’ " & # javascript
但是,僅過濾以上敏感字符是遠(yuǎn)遠(yuǎn)不夠的。為了能夠提供兩層防御和確保Web應(yīng)用程序的安全,對Web應(yīng)用的輸出也要進(jìn)行過濾和編碼。
輸出編碼
當(dāng)需要將一個(gè)字符串輸出到Web網(wǎng)頁時(shí),同時(shí)又不確定這個(gè)字符串中是否包括XSS特殊字符(如< > & ‘ “等),為了確保輸出內(nèi)容的完整性和正確性,可以使用編碼(HTMLEncode)進(jìn)行處理。
HTML編碼在防止XSS攻擊上起到很大的作用,它主要是用對應(yīng)的HTML標(biāo)記換為實(shí)體,這樣做可確保瀏覽器顯示實(shí)體,但不運(yùn)行他們,將其當(dāng)作HTML文檔的內(nèi)容而非結(jié)構(gòu)加以處理。一些常見的可能造成問題的字符的HTML編碼:
htmlspecialchars()函數(shù)可以將以下五種HTML 特殊字符轉(zhuǎn)成字符實(shí)體編碼:
如果說對輸入數(shù)據(jù)的過濾是針對可疑的信息進(jìn)行防范,那么針對輸出數(shù)據(jù)進(jìn)行編碼,就是讓可能造成危害的信息變成無害。
過濾方法
- 輸入過濾:在數(shù)據(jù)存儲(chǔ)數(shù)據(jù)庫之前便對特殊的字符進(jìn)行轉(zhuǎn)義,方便簡潔,順便可以把SQL注入等其他漏洞一并檢驗(yàn)。而缺點(diǎn)就是無法處理之前已經(jīng)存在于數(shù)據(jù)庫中的惡意代碼。
- 輸出過濾:在數(shù)據(jù)輸出之前先對部分敏感字符進(jìn)行轉(zhuǎn)義,這是一個(gè)很安全的方法,能有效保持?jǐn)?shù)據(jù)的完整性。缺點(diǎn)是必須對每一個(gè)細(xì)節(jié)的輸出仔細(xì)過濾,因此會(huì)帶來額外的工作量。
Web安全編碼規(guī)范
在輸出數(shù)據(jù)前對潛在威脅的字符進(jìn)行編碼、轉(zhuǎn)義,是防御XSS攻擊的有效措施。 這些輸出一般是動(dòng)態(tài)內(nèi)容。對Web應(yīng)用而言,其動(dòng)態(tài)內(nèi)容可能來源于用戶輸入、URL、HTTP頭、POST數(shù)據(jù)、Cookies的值、查詢關(guān)鍵字等,所以,在應(yīng)對不同背景下的動(dòng)態(tài)內(nèi)容的XSS攻擊時(shí),要部署不同的解決方案。
body文本:
假設(shè)有如下HTML片段:
< b>錯(cuò)誤: 你的查詢 <?=$quer y?>沒有返回任何結(jié)果
攻擊者可能將動(dòng)態(tài)內(nèi)容$quer y替換成惡意的XSS輸入:
< script>evil_script()< /script>
返回的HTML代碼為:
< b>錯(cuò)誤: 你的查詢< script>evil_script()< /script>沒有返回任何結(jié)果< /b>
把下列能觸發(fā)XSS的字符用相應(yīng)的HTML實(shí)體代替(和PHP的htmlspecialchars()功能一致):
HTML標(biāo)簽中的內(nèi)容:
一些HTML標(biāo)簽如< input>、< style>、< color>等的屬性值可能為動(dòng)態(tài)內(nèi)容,該
情況下常存在XSS威脅。
< div>查詢值:query</div>或<inputname="name"value="<?=quer y</div>或<input name="name" value="<?=query</div>或<inputname="name"value="<?=quer y?>“>
攻擊者試圖輸入<、>等字符產(chǎn)生一個(gè)新的< script>標(biāo)記:xss”>< script>evil_script()< /script>
然后,返回HTML代碼如下:
< input name=“name” value=“xss”>< script>evil_script()< /script>"> >
假設(shè)有以下的HTML代碼片段:
< input name=“name” value=<?=$quer y?>>
惡意輸入為:
xss οnmοuseοver=evil_script()
渲染后的HTML代碼如下:
< input name=“name” value=xss οnmοuseοver=alert(/xss/)>
當(dāng)受害者移動(dòng)光標(biāo)到input輸入欄時(shí),腳本就會(huì)被執(zhí)行。
< script>< /script>中的內(nèi)容:
< script>
var msg=‘<?=$quer y?>’;
</ script>
惡意輸入為:
xss’; evil_script(); //
最終結(jié)果為:
< script>
var msg=
‘xss’;evil_script(); //
< /script> >
解決方案:
盡量避免或減少在Javascript上下文中使用動(dòng)態(tài)內(nèi)容,稍不謹(jǐn)慎就會(huì)導(dǎo)致跨站腳本攻擊。另外,在 JavaScript中會(huì)出現(xiàn)< /script>關(guān)鍵字與前面的< script>標(biāo)簽閉合,還有/* */等 JavaScript注釋也會(huì)被惡意利用,所以對這些字符要進(jìn)行編碼過濾。
JavaScript事件:
考慮如下情況:
< input type=button name=smt value=‘確定’ οnclick=‘GotoUrl(“<?=$targetUrl>”);’>
惡意輸入為:foo");evil_script("
返回的HTML代碼為:
< input type=button name=smt value=‘確定’ οnclick=‘GotoUrl(“foo”);evil_script(“”);’>
總體來說,上述的編碼規(guī)則實(shí)際上表達(dá)是同一個(gè)概念,即:將未信任數(shù)據(jù)嵌入到任何輸出之前都應(yīng)按照上下文的轉(zhuǎn)義規(guī)則對其進(jìn)行編碼。