php xss filter

  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值