- 四兩撥千斤:HttpOnIy
嚴(yán)格地說面殖,HttpOnly并非為了對(duì)抗XSS——HttpOnly解決的是XSS后的Cookie劫持攻擊。
Cookie設(shè)置了HttpOnly哭廉,則使用XSS竊取用戶的Cookie會(huì)失敗脊僚,因?yàn)镴avaScript讀取不到Cookie的值。
但是遵绰,HttpOnly不是萬能的辽幌,添加了HttpOnly不等于解決了XSS問題。XSS攻擊帶來的不光是Cookie劫持問題椿访,還有竊取用戶信息乌企、模擬用戶身份執(zhí)行操作等諸多嚴(yán)重的后果。如前文所述成玫,攻擊者利用AJAX構(gòu)造HTTP請(qǐng)求加酵,以用戶身份完成的操作,就是在不知道用戶Cookie的情況下進(jìn)行的哭当。使用HttpOnly有助于緩解XSS攻擊猪腕,但仍然需要其他能夠解決XSS漏洞的方案。 - 輸入檢查
使用XSS Filter類钦勘,過濾掉非法字符陋葡,但要注意不要誤傷友軍。 - 輸出檢查
一般來說彻采,除了富文本的輸出外腐缤,在變量輸出到HTML頁面時(shí),可以使用編碼或轉(zhuǎn)義的方式來防御XSS攻擊
3.1 安全的編碼函數(shù)
編碼分為很多種肛响,針對(duì)HTML代碼的編碼方式是HtmlEncode岭粤。
HtmlEncode并非專用名詞,它只是一種函數(shù)實(shí)現(xiàn)终惑。它的作用是將字符轉(zhuǎn)換成HTMLEntities,對(duì)應(yīng)的標(biāo)準(zhǔn)是ISO-8859-1门扇。
為了對(duì)抗XSS雹有,在HtmlEncode中要求至少轉(zhuǎn)換以下字符:
& --> &
< --> <--> >
" --> "
/ --> / 包含反斜線是因?yàn)樗赡軙?huì)閉合一些HTML entity
在PHP中偿渡,有htmlentities() 和htmlspecialchars() 兩個(gè)函數(shù)可以滿足安全要求。
相應(yīng)地霸奕,JavaScript的編碼方式可以使用JavascriptEncode溜宽。 - 正確地防御XSS
為了更好地設(shè)計(jì)XSS防御方案,需要認(rèn)清XSS產(chǎn)生的本質(zhì)原因质帅。XSS的本質(zhì)還是一種“HTML注入”适揉,用戶的數(shù)據(jù)被當(dāng)成了HTML代碼一部分來執(zhí)行,從而混淆了原本的語義煤惩,產(chǎn)生了新的語義嫉嘀。
如果網(wǎng)站使用了MVC架構(gòu),那么XSS就發(fā)生在View層——在應(yīng)用拼接變量到HTML頁面時(shí)產(chǎn)生魄揉。所以在用戶提交數(shù)據(jù)處進(jìn)行輸入檢查的方案,其實(shí)并不是在真正發(fā)生攻擊的地方做防御洛退。
想要根治XSS問題瓣俯,可以列出所有XSS可能發(fā)生的場(chǎng)景,再一一解決兵怯。 - 處理富文本
如何區(qū)分安全的“富文本”和有攻擊性的XSS呢?
在處理富文本時(shí)媒区,還是要回到“輸入檢查”的思路上來驼仪∽そ觯“輸入檢查”的主要問題是谅畅,在檢查時(shí)還不知道變量的輸出語境噪服。但用戶提交的“富文本”數(shù)據(jù),其語義是完整的HTML代碼粘优,在輸出時(shí)也不會(huì)拼湊到某個(gè)標(biāo)簽的屬性中仇味。因此可以特殊情況特殊處理。
在上一節(jié)中雹顺,列出了所有在HTML中可能執(zhí)行腳本的地方丹墨。而一個(gè)優(yōu)秀的“XSS Filter”,也應(yīng)該能夠找出HTML代碼中所有可能執(zhí)行腳本的地方嬉愧。
HTML是一種結(jié)構(gòu)化的語言贩挣,比較好分析。通過htmlparser可以解析出HTML代碼的標(biāo)簽、標(biāo)簽屬性和事件王财。在過濾富文本時(shí)卵迂,“事件”應(yīng)該被嚴(yán)格禁止,因?yàn)椤案晃谋尽钡恼故拘枨罄锊粦?yīng)該包括“事件”這種動(dòng)態(tài)效果绒净。而一些危險(xiǎn)的標(biāo)簽见咒,比如<iframe>、<script>挂疆、<base>改览、<form>等,也是應(yīng)該嚴(yán)格禁止的缤言。
在標(biāo)簽的選擇上宝当,應(yīng)該使用白名單,避免使用黑名單墨闲。比如今妄,只允許 <a>、<img>鸳碧、<div>等比較“安全”的標(biāo)簽存在盾鳞。
“白名單原則”不僅僅用于標(biāo)簽的選擇,同樣應(yīng)該用于屬性與事件的選擇瞻离。
在富文本過濾中腾仅,處理CSS也是一件麻煩的事情。如果允許用戶自定義CSS套利、style推励,則也可能導(dǎo)致XSS攻擊。因此盡可能地禁止用戶自定義CSS與style肉迫。 - 防御DOM Based XSS
DOM Based XSS是一種比較特別的XSS漏洞验辞,前文提到的幾種防御方法都不太適用,需要特別對(duì)待喊衫。
事實(shí)上跌造,DOM Based XSS是從JavaScript中輸出數(shù)據(jù)到HTML頁面里。而前文提到的方法都是針對(duì)“從服務(wù)器應(yīng)用直接輸出到HTML頁面”的XSS漏洞族购,因此并不適用于DOM Based XSS壳贪。
從JavaScript輸出到HTML頁面,也相當(dāng)于一次XSS輸出的過程寝杖,需要分語境使用不同的編碼函數(shù)违施。
文章為總結(jié)整理文,原文來自:《白帽子講Web安全》
https://weread.qq.com/web/reader/7c4327b05cfd497c4eaa52f