PHP防御XSS攻击的终极解决方案

独自等待 2017年5月12日02:19:43评论530 views字数 1361阅读4分32秒阅读模式

最近测试XSS攻击修复时,找到的一个比较不错的文章,分享给大家。

Update20151202:

感谢大家的关注和回答,目前我从各种方式了解到的防御方法,整理如下:

PHP直接输出html的,可以采用以下的方法进行过滤:

1.htmlspecialchars函数

2.htmlentities函数

3.HTMLPurifier.auto.php插件

4.RemoveXss函数(百度可以查到)

PHP输出到JS代码中,或者开发Json API的,则需要前端在JS中进行过滤:

1.尽量使用innerText(IE)和textContent(Firefox),也就是jQuery的text()来输出文本内容

2.必须要用innerHTML等等函数,则需要做类似php的htmlspecialchars的过滤(参照@eechen的答案)

其它的通用的补充性防御手段

1.在输出html时,加上Content Security Policy的Http Header

(作用:可以防止页面被XSS攻击时,嵌入第三方的脚本文件等)
(缺陷:IE或低版本的浏览器可能不支持)

2.在设置Cookie时,加上HttpOnly参数

(作用:可以防止页面被XSS攻击时,Cookie信息被盗取,可兼容至IE6)
(缺陷:网站本身的JS代码也无法操作Cookie,而且作用有限,只能保证Cookie的安全)

3.在开发API时,检验请求的Referer参数

(作用:可以在一定程度上防止CSRF攻击)
(缺陷:IE或低版本的浏览器中,Referer参数可以被伪造)

4、补充一个xss过滤的函数。。

function clean_xss(&$string, $low = False)
 {
  if (! is_array ( $string ))
  {
   $string = trim ( $string );
   $string = strip_tags ( $string );
   $string = htmlspecialchars ( $string );
   if ($low)
   {
    return True;
   }
   $string = str_replace ( array ('"', "\\", "'", "/", "..", "../", "./", "//" ), '', $string );
   $no = '/%0[0-8bcef]/';
   $string = preg_replace ( $no, '', $string );
   $no = '/%1[0-9a-f]/';
   $string = preg_replace ( $no, '', $string );
   $no = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S';
   $string = preg_replace ( $no, '', $string );
   return True;
  }
  $keys = array_keys ( $string );
  foreach ( $keys as $key )
  {
   clean_xss ( $string [$key] );
  }
 }

XSS跨站脚本攻击

大概就是这些了,大家还有什么别的思路,欢迎补充!

原文转载自:https://segmentfault.com/q/1010000004067521



from www.waitalone.cn.thanks for it.

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
独自等待
  • 本文由 发表于 2017年5月12日02:19:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   PHP防御XSS攻击的终极解决方案https://cn-sec.com/archives/50366.html

发表评论

匿名网友 填写信息