接下来我们继续了解如何过滤用户输入页面内的正常内容。 翻译自:原文出处 VER:Updated Oct 14, 2011 by ivan@ludios.org
假设我们有一个模版或者一个表单的HTML片段
**错误: 你请求的内容 '%(query)' 没有找到。**
如果攻击者已经可以将请求内容插入到页面中,例如:
<script>evil_script()</script>
那么页面中的片段将会呈现为
**错误: 你请求的内容 '<script>evil_script()</script>' 没有找到。**
那么恶意脚本将会执行,例如将无辜的用户的cookies窃取。
解决方法
如何插入页面中的字符串必须将下列字符替换为相应的HTML/SGML实体:
- 替换
<tt><</tt>
为<tt><</tt>
- 替换
<tt>></tt>
为<tt>></tt>
- 替换
<tt>&</tt>
为<tt>&</tt>
- 替换
<tt>"</tt>
为<tt>"</tt>
- 替换
<tt>'</tt>
为<tt>'</tt>
基本原理
小于号和大于号需要被转义,因为他们是HTML标签的分隔符,任何标签都逃不过它们,如果它们没有被转义的话(包括script
标签)浏览器将会解析它们。
<script>
如果上面的标签中的符号没有被转义,将不会导致安全问题,但是会引发浏览器渲染问题。可能将符号解释为实体的开启而不是正常的显示它。 如果你想了解更多,可以查看这篇文章JavaScript 实体在标签之外无效。
没有必要转义这里的内容中的引号,但是有必要转义其他地方的引号,最简单的方法就是在每一处地方使用转义函数。