& 轉成 &amp; “ 轉成 &quot; < 轉成 &lt; > 轉成 &gt; ‘ 轉成 &#39; |
當直接調用 htmlspecialchars($str)時, & " < > 被轉義。
當設置 ENT_QUOTES 標記時, 即調用htmlspecialchars($str, ENT_QUOTES)時,單引號也被轉義。
當設置 ENT_NOQUOTES 標記時,單引號和雙引號都不會被轉義。即調用 htmlspecialchars($str, ENT_NOQUOTES)時,只有& < > 被轉義。
不同背景下的動態內容的 XSS 攻擊及解決方案
XSS 攻擊輸入與動態內容所處的代碼背景相關,譬如動態內容為表單元素屬性的值、位于 HTML 正文、或是 Javascript 代碼段中等等。
HTML標記的屬性為動態內容
Web 應用中,"input"、"style"、"color" 等 HTML 標記的屬性都可能為動態內容,其中"input" 標記的 "value" 屬性通常為動態內容。
例子1
<form…><INPUT type=text name="msg" id="msg" size=10 maxlength=8 value="<?= $msg?>"></form> |
攻擊XSS輸入
Hello"><script>evil_script()</script> |
將動態內容替換
將 $msg 替換為惡意 XSS 輸入:
<form…><INPUT type=text name="msg" id="msg" size=10 maxlength=8 value="Hello"><script>evil_script()</script>"></form> |
例子2
<form…><INPUT type=text name="msg" id="msg" size=10 maxlength=8 value=<?= $msg?>></form> |
攻擊 XSS 輸入
Hello onmouseover=evil_script() |
將動態內容替換
將 $msg 替換為惡意 XSS 輸入:
<form…><INPUT type=text name="msg" id="msg" size=10 maxlength=8 value=Hello onmouseover=evil_script()></form> |
分析
從例子 1 可以看到其 XSS攻擊輸入中包含了 HTML 特殊字符 < > "
從例子 2 可以看到其 XSS 攻擊輸入中沒有包含上節中提到的五種 HTML 字符, 但是 "value"屬性值沒有使用雙引號包圍。
解決方案
調用htmlspecialchars($str, ENT_QUOTES)將以下 5 種 HTML 特殊字符 < > &‘ “ 轉義;同時使屬性值被雙引號包圍。譬如:
<form…><INPUT type=text name="msg" id="msg" size=10 maxlength=8 value="<?= htmlspecialchars($msg, ENT_QUOTES))?>"></form> |
注意事項
將 input 的 value 進行轉義,必須考慮顯示和存儲數據的一致性問題,即顯示在瀏覽器端和存儲在服務器端后臺的數據可能因為轉義而變得不一致。譬如存儲在服務器端的后臺原始數據包含了以上 5 種特殊字符,但是沒有轉義,為了防止 XSS 攻擊,在瀏覽器端輸出時對 HTML 特殊字符進行了轉義:
原文轉自:http://www.uml.org.cn/Test/201407161.asp