xss防御

  1. 四兩撥千斤: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漏洞的方案。
  2. 輸入檢查
    使用XSS Filter類,過濾掉非法字符,但要注意不要誤傷友軍。
  3. 輸出檢查
    一般來說,除了富文本的輸出外,在變量輸出到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。

  4. 正確地防御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ā)生的場景,再一一解決。
  5. 處理富文本
    如何區(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。
  6. 防御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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容