- 四兩撥千斤:HttpOnIy
嚴格地說,HttpOnly并非為了對抗XSS——HttpOnly解決的是XSS后的Cookie劫持攻擊。
Cookie設(shè)置了HttpOnly,則使用XSS竊取用戶的Cookie會失敗,因為JavaScript讀取不到Cookie的值。
但是,HttpOnly不是萬能的,添加了HttpOnly不等于解決了XSS問題。XSS攻擊帶來的不光是Cookie劫持問題,還有竊取用戶信息、模擬用戶身份執(zhí)行操作等諸多嚴重的后果。如前文所述,攻擊者利用AJAX構(gòu)造HTTP請求,以用戶身份完成的操作,就是在不知道用戶Cookie的情況下進行的。使用HttpOnly有助于緩解XSS攻擊,但仍然需要其他能夠解決XSS漏洞的方案。 - 輸入檢查
使用XSS Filter類,過濾掉非法字符,但要注意不要誤傷友軍。 - 輸出檢查
一般來說,除了富文本的輸出外,在變量輸出到HTML頁面時,可以使用編碼或轉(zhuǎn)義的方式來防御XSS攻擊
3.1 安全的編碼函數(shù)
編碼分為很多種,針對HTML代碼的編碼方式是HtmlEncode。
HtmlEncode并非專用名詞,它只是一種函數(shù)實現(xiàn)。它的作用是將字符轉(zhuǎn)換成HTMLEntities,對應(yīng)的標準是ISO-8859-1。
為了對抗XSS,在HtmlEncode中要求至少轉(zhuǎn)換以下字符:
& --> &
< --> <--> >
" --> "
/ --> / 包含反斜線是因為它可能會閉合一些HTML entity
在PHP中,有htmlentities() 和htmlspecialchars() 兩個函數(shù)可以滿足安全要求。
相應(yīng)地,JavaScript的編碼方式可以使用JavascriptEncode。 - 正確地防御XSS
為了更好地設(shè)計XSS防御方案,需要認清XSS產(chǎn)生的本質(zhì)原因。XSS的本質(zhì)還是一種“HTML注入”,用戶的數(shù)據(jù)被當成了HTML代碼一部分來執(zhí)行,從而混淆了原本的語義,產(chǎn)生了新的語義。
如果網(wǎng)站使用了MVC架構(gòu),那么XSS就發(fā)生在View層——在應(yīng)用拼接變量到HTML頁面時產(chǎn)生。所以在用戶提交數(shù)據(jù)處進行輸入檢查的方案,其實并不是在真正發(fā)生攻擊的地方做防御。
想要根治XSS問題,可以列出所有XSS可能發(fā)生的場景,再一一解決。 - 處理富文本
如何區(qū)分安全的“富文本”和有攻擊性的XSS呢?
在處理富文本時,還是要回到“輸入檢查”的思路上來?!拜斎霗z查”的主要問題是,在檢查時還不知道變量的輸出語境。但用戶提交的“富文本”數(shù)據(jù),其語義是完整的HTML代碼,在輸出時也不會拼湊到某個標簽的屬性中。因此可以特殊情況特殊處理。
在上一節(jié)中,列出了所有在HTML中可能執(zhí)行腳本的地方。而一個優(yōu)秀的“XSS Filter”,也應(yīng)該能夠找出HTML代碼中所有可能執(zhí)行腳本的地方。
HTML是一種結(jié)構(gòu)化的語言,比較好分析。通過htmlparser可以解析出HTML代碼的標簽、標簽屬性和事件。在過濾富文本時,“事件”應(yīng)該被嚴格禁止,因為“富文本”的展示需求里不應(yīng)該包括“事件”這種動態(tài)效果。而一些危險的標簽,比如<iframe>、<script>、<base>、<form>等,也是應(yīng)該嚴格禁止的。
在標簽的選擇上,應(yīng)該使用白名單,避免使用黑名單。比如,只允許 <a>、<img>、<div>等比較“安全”的標簽存在。
“白名單原則”不僅僅用于標簽的選擇,同樣應(yīng)該用于屬性與事件的選擇。
在富文本過濾中,處理CSS也是一件麻煩的事情。如果允許用戶自定義CSS、style,則也可能導(dǎo)致XSS攻擊。因此盡可能地禁止用戶自定義CSS與style。 - 防御DOM Based XSS
DOM Based XSS是一種比較特別的XSS漏洞,前文提到的幾種防御方法都不太適用,需要特別對待。
事實上,DOM Based XSS是從JavaScript中輸出數(shù)據(jù)到HTML頁面里。而前文提到的方法都是針對“從服務(wù)器應(yīng)用直接輸出到HTML頁面”的XSS漏洞,因此并不適用于DOM Based XSS。
從JavaScript輸出到HTML頁面,也相當于一次XSS輸出的過程,需要分語境使用不同的編碼函數(shù)。
文章為總結(jié)整理文,原文來自:《白帽子講Web安全》
https://weread.qq.com/web/reader/7c4327b05cfd497c4eaa52f