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