[总结]PHP防御XSS

一个重一个要的PHP函数

这个总结也可以叫做htmlspecialchars()的使用总结吧..
看下htmlspecialchars()的用法,后面要多次用到.

1.HTML标签的属性为动态内容

例如:

<input id="username" name="username" value="<?php echo $username ?>">

防御方法

  • 使用htmlspecialchars($str, ENT_QUOTES)将以下 5 种 HTML 特殊字符 < > &‘ “ 全部进行转义
  • 同时使属性值被双引号包围。

实验

以下截图注意引号与其他内容的颜色,其代表着浏览器对内容的完全不同的解析方式!!!

未转义
<input type"text" name="msg" id="msg" onmouseover="alert()">

转义后
<input type"text" name="msg" id="msg" onmouseover="alert()">

2.HTML文本为动态内容

例如:

<b> 欢迎:<? php echo $str ?></b>

防御方法

  • 直接使用htmlspecialchars($str,ENT_QUOTES)把五个特殊字符都转义就ok.

3.动态内容为JavaScript事件处理函数的参数

例如:

<input type="text" name="msg" id="msg " value="Hello" onclick='alert("<?php echo $str ?>")'>

防御方法

  • 这里的内容…还是不要让用户触碰了.这部分内容的数据还是掌握在自己手里吧.
  • 注意这里用htmlspecialchars函数进行过滤,是无法防御的.后面例子将给出说明.
实验

$str的值为: foo");alert("evil_script
这里将会体现出为什么使用htmlspecialchars函数进行转义后依然可以轻易被攻击.

未转义
<input type="text" name="msg" id="msg " value="Hello" onclick='alert("foo");alert("evil_script")'>

转义后
<input type="text" name="msg" id="msg " value="Hello" onclick='alert("foo");alert("evil_script")'>


浏览器对其的解析与未转义时相同!!!
因为浏览器会的HTML解析器会先于JavaScript解析器对页面进行解析.

4.动态内容位于 JavaScript 代码段中

防御方法

  • 用htmlspecialchars进行转义? 看情况…
  1. 当需要被转义的内容为非恶意的正常数据时不包含那5个特殊字符是可以用的.
  2. 但当需要被转义的正常数据中可能包含特殊字符的时候,不可使用.
    是因为HTML解析后再进行JavaScript解析?
    不是,是因为HTML解析器不会对script标签内的内容进行解析,从而会导致转义后的内容JavaScript解析器都看不懂那些代码啊
  • 同样,这里的内容…还是不要让用户触碰了.这部分内容的内容还是掌握在自己手里吧.

参考:

还有其他我认为不太可能碰到的情况,就没有列出,大家可以参看下面这篇文章