4類防御XSS的有效方法

最近在看《白帽子講Web安全》這本書,對于XSS有了一定的了解。現(xiàn)在對于書中關(guān)于防御XSS的4種方法做一些總結(jié)與解說。


XSS的本質(zhì)

XSS事件發(fā)生在網(wǎng)站前端,在相關(guān)的數(shù)據(jù)替換到前端頁面中時(shí),新舊數(shù)據(jù)結(jié)合,混淆了頁面原本的語義,產(chǎn)生了新的語義。以下面這種情況為例:

<a href="$var">test</a>

將$var的值注入到頁面中,本來是為了提供一個(gè)跳轉(zhuǎn)用的url地址。但若將$var的值設(shè)為" onclick=alert(1)\,則以上HTML變?yōu)榱耍?/p>

<a href="" onclick=alert(1) \">test</a>

點(diǎn)擊test文字后,會進(jìn)行alert輸出,即改變了原有的HTML語義。


HtmlEncode

當(dāng)$var變量出現(xiàn)在HTML標(biāo)簽或?qū)傩灾袝r(shí),XSS可分別通過以下兩種方法來進(jìn)行注入。

  1. 在HTML標(biāo)簽中,如下所示:
<p>$var</p>

若不對$var進(jìn)行任何處理,當(dāng)$var的值為<script>alert(1)</script>時(shí),在一些老式的瀏覽器中,HTML代碼如下:

<p><script>alert(1)</script></p>

則這些瀏覽器會執(zhí)行alert的js操作,實(shí)現(xiàn)了XSS注入。

  1. 在HTML屬性中,如下所示:
<p name="$var">test</p>

若不對$var進(jìn)行任何處理,當(dāng)$var的值為"> <script>alert(1)</script>時(shí),HTML代碼如下:

<p name=""> <script>alert(1)</script>">test</p>

則瀏覽器會執(zhí)行alert的js操作,實(shí)現(xiàn)了XSS注入。

為了防御這兩種XSS,可以采用對$var變量進(jìn)行HtmlEncode的方法。HtmlEncode的作用是將$var的一些字符進(jìn)行轉(zhuǎn)化,使得瀏覽器在最終輸出結(jié)果上是一樣的,但能夠防止注入的JavaScript執(zhí)行。

HtmlEncode支持的轉(zhuǎn)換舉例如下:

& --> &
< --> <
> --> >

<script>alert(1)</script>

為例,對$var進(jìn)行HtmlEncode后的結(jié)果為:

<script>alert(1)</script>

以上HTML在瀏覽器中的顯示結(jié)果就是<script>alert(1)</script>,實(shí)現(xiàn)了將$var作為純文本進(jìn)行了輸出,且不引起JavaScript的執(zhí)行。


JavaScriptEncode

當(dāng)$var變量出現(xiàn)在<script>標(biāo)簽內(nèi)或其它JavaScript的執(zhí)行環(huán)境中時(shí),XSS可通過以下方法來進(jìn)行注入,示例如下:

<script>
    var x = "$var";
</script>

若不對$var進(jìn)行任何處理,當(dāng)$var的值為";alert(1);"時(shí),JavaScript代碼如下:

<script>
    var x = "";alert(1);""
</script>

則瀏覽器會執(zhí)行alert的js操作,實(shí)現(xiàn)了XSS注入。

為了防御這種XSS,可以采用對$var變量進(jìn)行JavaScriptEncode的方法。JavaScriptEncode的作用可以是將$var中除了數(shù)字、字母外的所有字符進(jìn)行十六進(jìn)制化處理,使得瀏覽器最終輸出結(jié)果上是一樣的,但能夠防止注入的JavaScript執(zhí)行。

";alert(1);"

為例,對$var進(jìn)行JavaScriptEncode后的結(jié)果為:

\x22\x3balert\x281\x29\x3b\x22

其中\(zhòng)x28代表(,\x29代表),以上字符串在JavaScript環(huán)境中即為"alert(1)",內(nèi)容不變,但XSS并不執(zhí)行。


CSSEncode

當(dāng)$var變量出現(xiàn)在<style>標(biāo)簽內(nèi)或其它c(diǎn)ss的執(zhí)行環(huán)境中時(shí),XSS的注入和防御原理同JavaScript。在此不累述了。
css中xss的注入,在現(xiàn)在的瀏覽器中基本已經(jīng)被禁止了,因此也比較少見。


URLEncode

當(dāng)$var變量出現(xiàn)在url跳轉(zhuǎn)地址中時(shí),XSS可通過以下方法來進(jìn)行注入,示例如下:

<a >test</a>

若不對$var進(jìn)行任何處理,當(dāng)$var的值為" onclick="alert(1);return false;"時(shí),代碼如下:

<a  onclick="alert(1);return false;">test</a>

此時(shí)就會阻止了url頁面跳轉(zhuǎn),實(shí)現(xiàn)了XSS注入。

為了防御這種XSS,可以采用對$var變量進(jìn)行URLEncode的方法。URLEncode的作用是將字符轉(zhuǎn)化為%HH的形式,支持的轉(zhuǎn)換舉例如下:

空格 --> %20
< --> %3c
> --> %3e

以上述的

" onclick="alert(1);return false;"

為例,URLEncode后的結(jié)果如下:

%22%20onclick%3d%22alert%281%29%3breturn%20false%3b%22

原有代碼變?yōu)椋?/p>

<a >test</a>

此時(shí)便阻止了XSS的注入。

如果上述例子改為:

<a href="$var">test</a>

即$var指代了完整的url地址,則可能出現(xiàn)以下兩種情況:

<a href="javascript:alert(1)">test</a>
<a href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTs8L3NjcmlwdD4=">test2</a>

這兩種代碼都能夠注入XSS,為了防御這些情況,可以先檢測$var中是否包含url的protocol字段,如果沒有,就加上,再對整個(gè)url進(jìn)行URLEncode處理。


結(jié)語

以上是我的一些經(jīng)驗(yàn)與心得,若有不足之處,請予指正。希望這篇文章對你有所幫助_。

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

相關(guān)閱讀更多精彩內(nèi)容

  • 之前積累了XSS 有一段時(shí)間,因?yàn)槟壳伴_始了一件有趣的工程,需要整合非常多的知識,其中Web 安全這一塊出現(xiàn)最多的...
    刀背藏身閱讀 9,573評論 0 16
  • 客戶端(瀏覽器)安全 同源策略(Same Origin Policy) 同源策略阻止從一個(gè)源加載的文檔或腳本獲取或...
    人在碼途閱讀 1,908評論 0 8
  • 在那個(gè)年代,大家一般用拼接字符串的方式來構(gòu)造動態(tài) SQL 語句創(chuàng)建應(yīng)用,于是 SQL 注入成了很流行的攻擊方式。在...
    Gundy_閱讀 594評論 0 5
  • 在那個(gè)年代,大家一般用拼接字符串的方式來構(gòu)造動態(tài) SQL 語句創(chuàng)建應(yīng)用,于是 SQL 注入成了很流行的攻擊方式。在...
    Safesonic閱讀 735評論 0 4
  • 目標(biāo):百分之九十以上的分?jǐn)?shù) 這一段時(shí)間是可以這樣做的,至少提醒自己,挽回成本,做不到,也是個(gè)警醒。 中心詞:思想 ...
    良辰美LiangChen閱讀 168評論 0 0

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