1. 當再度將表單提交時,存儲的內容將會變成轉義后的值。
2. 當使用 JavaScript 操作表單元素,需要使用到表單元素的值時,必須考慮到值可能已經被轉義。
HTML文本為動態內容
例子
<b> 歡迎:<?= $welcome_msg?></b> 攻擊XSS輸入 <script>evil_script()</script> 將動態內容替換 將$welcome_msg 替換為惡意 XSS 輸入: <b>歡迎:<script>evil_script()</script></b> |
分析
在 HTML 正文背景下,< > 字符會引入 HTML 標記,& 可能會認為字符實體編碼的開始,所以需要將 < > & 轉義
解決方案
為簡潔起見,直接使用 htmlspecialchars()將 5 種 HTML 特殊字符轉義,如:
<b>歡迎:<?= htmlspecialchars($welcome_msg,, ENT_NOQUOTES)?></b> |
URL的值為動態內容
Script/Style/Img/ActiveX/Applet/Frameset… 等標記的 src 或 href 屬性如果為動態內容,必須確保這些 URL 沒有指向惡意鏈接。
例子1
<script src=<?= "$script_url>"> 攻擊XSS輸入 http://evil.org/evil.js 將動態內容替換 將$script_url替換為惡意 XSS 輸入: <script src="http://evil.org/evil.js"> |
例子2
<img src=”<?= $img_url>”> 攻擊XSS輸入 javascript:evil_script() 將動態內容替換 將$img_url替換為惡意XSS輸入: <img src=” javascript:evil_script()”> |
分析
一般情況下盡量不要讓 URL 的值被用戶控制。如果用戶需要自己定義自己的風格及顯示效果,也不能讓用戶直接控制整個 URL 的內容,而是提供預定義好的風格供用戶設置、裝配,然后由后臺程序根據用戶的選擇組合成安全的 URL 輸出。
字符集編碼
瀏覽器需要知道字符集編碼才能正確地顯示網頁。如果字符集編碼沒有顯式在 content-type 或meta 中定義,瀏覽器會有算法猜測網頁的字符集編碼。譬如<script>alert(document.cookie)</script> 的 UTF-7 編碼為:
+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4- |
如果+ADw-script+AD4-alert(document.cookie)+ADw-/script+AD4-作為動態內容位于網頁的頂端并傳送到瀏覽器端,IE 會認為此網頁是 UTF-7 編碼,從而使網頁不能正常顯示。
解決方案
顯式定義網頁的字符集編碼,譬如
<meta http-equiv=content-type content="text/html; charset=UTF-8"> |
動態內容為JavaScript事件處理函數的參數
JavaScript 事件處理函數如 onClick/onLoad/onError/onMouseOver/ 的參數可能包含動態內容。
例子
<input type="button" value="go to" onClick='goto_url("<?= $target_url>");'> 攻擊XSS輸入 foo&quot;);evil_script(&quot; 將動態內容替換 HTML 解析器會先于 JavaScript 解析器解析網頁,將$target_url 替換為惡意 XSS 輸入: <input type="button" value="go to" onClick='goto_url("foo");evil_script("");'> 動態內容位于 JavaScript 代碼段中 |
原文轉自:http://www.uml.org.cn/Test/201407161.asp