php xss filter

来源:互联网 发布:澳洲研究型硕士 知乎 编辑:程序博客网 时间:2024/06/06 17:46
  1. function transform_HTML($string, $length =null){
  2. // Helps prevent XSS attacks
  3. // Remove dead space.
  4. $string = trim($string);
  5. // Prevent potential Unicode codec problems.
  6. $string = utf8_decode($string);
  7. // HTMLize HTML-specific characters.
  8. $string = htmlentities($string, ENT_NOQUOTES);
  9. $string = str_replace("#","#", $string);
  10. $string = str_replace("%","%", $string);
  11. $length = intval($length);
  12. if($length >0){
  13. $string = substr($string,0, $length);
  14. }
  15. return $string;

  1. }

这个函数将 HTML 特定的字符转换为 HTML 字面字符。一个浏览器对任何通过这个脚本的 HTML 以非标记的文本呈现。例如,考虑下面的 HTML 字符串:

  1. <STRONG>Bold Text</STRONG>

一般情况下,HTML 会显示为:Bold Text

但是,通过 transform_HTML() 后,它就像原始输入一样呈现。原因是处理的字符串中的标签字符串转换为 HTML 实体。transform_HTML() 的结果字符串的纯文本看起来像下面这样:

  1. <STRONG>Bold Text</STRONG>

该函数的实质是 htmlentities() 函数调用,它会将 <、>、和 & 转换为 &lt;&gt;、和 &amp;。尽管这会处理大部分的普通攻击,但有经验的 XSS 攻击者有另一种把戏:用十六进制或 UTF-8 编码恶意脚本,而不是采用普通的 ASCII 文本,从而希望能绕过你的过滤器。他们可以在 URL 的 GET 变量中发送代码,告诉浏览器,“这是十六进制代码,你能帮我运行吗?” 一个十六进制例子看起来像这样:

  1. <ahref="http://host/a.php?variable=%22%3e %3c%53%43%52%49%50%54%3e%44%6f%73%6f%6d%65%74%68%69%6e%67%6d%61%6c%69%63%69%6f%75%73%3c%2f%53%43%52%49%50%54%3e">

浏览器渲染这个信息的时候,结果就是:

  1. <ahref="http://host/a.php?variable="><SCRIPT>Dosomethingmalicious</SCRIPT>

为了防止这种情况,transform_HTML() 采用额外的步骤把 # 和 % 符号转换为它们的实体,从而避免十六进制攻击,并转换 UTF-8 编码的数据。

最后,为了防止某些人用很长的输入超载字符串从而导致某些东西崩溃,你可以添加一个可选的 $length 参数来截取你指定最大长度的字符串。



终极解决方案:HTML_Safe
http://pear.php.net/package/HTML_Safe/download

0 0
原创粉丝点击