阻止攻擊的常用方法是:在將HTML返回給Web瀏覽器之前,對攻擊者輸入的HTML進行編碼。HTML編碼使用一些沒有特定HTML意義的字符來代替那些標記字符(如尖括號)。這些替代字符不會影響文本在web瀏覽器上的顯示方式,僅僅用於阻止HTML渲染引擎將數據識別成HTML標記。這種方法能阻止一些XSS攻擊,但是以下幾種情況例外:
在Script塊中插入:
<script> ... var strEmailAdd = 'attacker data'; ... </script>
在這個例子中,數據本身就已經在script塊中了,攻擊者要做的就是關閉引用標記。
... var strEmailAdd = '';alert('Hi');// ...
引號加分號結束,最后可以注釋掉其他輸出內容避免出現阻止腳本運行的語法錯誤。
使用事件:
在HTML中,標記的屬性能夠被封裝在單引號和雙引號中,或者不需要引號。如果HTML的設計人員沒有使用雙引號來封裝屬性值,並對用戶的數據進行了HTML編碼,那么,這些不可信的數據會被限制在標記的范圍內,而不是限制在屬性的范圍內。大部分的標記有事件發生的時候,用戶定義的與那個事件相關聯的腳本就會運行。
如果不可信數據經過HTML編碼,並且在HTML中返回如下內容的時候,腳本仍然能夠運行:
<INPUT name="txtinput" type="text" value='unTrustData'>
如果 OurData' onclick=alert(Hi) junk=' 作為不可信數據發送,將會返回如下所示HTML:
<INPUT name="txtinput" type="text" value=' OurData' onclick=alert('Hi') junk=''>
當用戶單擊文本框時,onclick事件就被激發了,腳本就會運行。
使用Style:
Style中的表達式能夠被用來運行任意腳本,例如:
<INPUT name="txtinput" type="text" value="SomeValue" style="font-family:expression(alert('Hi'))">
腳本協議:
通過IMG標記中src屬性值的形式,將它們返回。
<IMG src="untrusted data">
兩種不同過濾的例子:
1.在返回數據前,刪除輸入中的字符串。但是如果輸入scriscriptpt,刪除后剩下的就是script。
2.通過轉義來阻止分隔屬性。
深入理解瀏覽器中的解析器:在<script>和</script>之間的任何東西都會被當作腳本,並對它們進行語法檢查。
<script> var strMyVar = '</script><script>alert('快船總冠軍')</script>'; ... </script>
瀏覽器會把上述內容解釋為兩個<script>塊,第一個塊有語法錯誤,並且不會運行。但是第二個塊語法正確會運行。