设为首页 收藏本站
查看: 1052|回复: 0

[经验分享] PHP如何防止XSS攻击

[复制链接]

尚未签到

发表于 2017-12-30 06:15:15 | 显示全部楼层 |阅读模式
  PHP防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数 。
  在使用htmlspecialchars()函数的时候注意第二个参数, 直接用htmlspecialchars($string) 的话,第二个参数默认是ENT_COMPAT,函数默认只是转化双引号(“), 不对单引号(‘)做转义.
  所以,htmlspecialchars函数更多的时候要加上第二个参数, 应该这样用: htmlspecialchars($string,ENT_QUOTES).当然,如果需要不转化如何的引号,用htmlspecialchars($string,ENT_NOQUOTES).
  另外, 尽量少用htmlentities, 在全部英文的时候htmlentities和htmlspecialchars没有区别,都可以达到目的.但是,中文情况下, htmlentities却会转化所有的html代码,连同里面的它无法识别的中文字符也给转化了。
  htmlentities和htmlspecialchars这两个函数对 '之类的字符串支持不好,都不能转化, 所以用htmlentities和htmlspecialchars转化的字符串只能防止XSS攻击,不能防止SQL注入攻击.
  所有有打印的语句如echo,print等 在打印前都要使用htmlentities() 进行过滤,这样可以防止Xss,注意中文要写出htmlentities($name,ENT_NOQUOTES,GB2312) 。
  (1).网页不停地刷新 '<meta http-equiv="refresh" content="0;">'

  (2).嵌入其它网站的链接 <iframe src=http://xxxx>  

<?php  

//php防注入和XSS攻击通用过滤  
$_GET     && SafeFilter($_GET);
  
$_POST    && SafeFilter($_POST);
  
$_COOKIE  && SafeFilter($_COOKIE);
  
function SafeFilter (&$arr)
  
{
  $ra=Array('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','/script/','/javascript/','/vbscript/','/expression/','/applet/'
  ,'/meta/','/xml/','/blink/','/link/','/style/','/embed/','/object/','/frame/','/layer/','/title/','/bgsound/'
  ,'/base/','/onload/','/onunload/','/onchange/','/onsubmit/','/onreset/','/onselect/','/onblur/','/onfocus/',
  '/onabort/','/onkeydown/','/onkeypress/','/onkeyup/','/onclick/','/ondblclick/','/onmousedown/','/onmousemove/'
  ,'/onmouseout/','/onmouseover/','/onmouseup/','/onunload/');
  if (($arr))
  {
  foreach ($arr as $key => $value)
  {
  if (!($value))
  {
  if (!())  //不对magic_quotes_gpc转义过的字符使用addslashes(),避免双重转义。
  
          {
  $value  = ($value); //给单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符)
  
             加上反斜线转义
  }
  $value       = ($ra,'',$value);     //删除非打印字符,粗暴式过滤xss可疑字符串
  $arr[$key]     = (($value)); //去除 HTML 和 PHP 标记并转换为 HTML 实体
  
        }
  else
  {
  SafeFilter($arr[$key]);
  }
  }
  }
  
}
  
?>
  
$str = 'www.90boke.com<meta http-equiv="refresh" content="0;">';
  
SafeFilter ($str); //如果你把这个注释掉,提交之后就会无休止刷新
  
echo $str;
  

  

//------------------------------php防注入和XSS攻击通用过滤-----Start--------------------------------------------//  

function string_remove_xss($html) {  preg_match_all(
"/\<([^\<]+)\>/is", $html, $ms);  $searchs[]
= '<';  $replaces[]
= '&lt;';  $searchs[]
= '>';  $replaces[]
= '&gt;';if ($ms[1]) {  $allowtags
= 'img|a|font|div|table|tbody|caption|tr|td|th|br|p|b|strong|i|u|em|span|ol|ul|li|blockquote';  $ms[
1] = array_unique($ms[1]);foreach ($ms[1] as $value) {  $searchs[]
= "&lt;".$value."&gt;";  $value
= str_replace('&amp;', '_uch_tmp_str_', $value);  $value
= string_htmlspecialchars($value);  $value
= str_replace('_uch_tmp_str_', '&amp;', $value);  $value
= str_replace(array('\\', '/*'), array('.', '/.'), $value);  $skipkeys
= array('onabort','onactivate','onafterprint','onafterupdate','onbeforeactivate','onbeforecopy','onbeforecut','onbeforedeactivate','onbeforeeditfocus','onbeforepaste','onbeforeprint','onbeforeunload','onbeforeupdate','onblur','onbounce','oncellchange','onchange','onclick','oncontextmenu','oncontrolselect','oncopy','oncut','ondataavailable','ondatasetchanged','ondatasetcomplete','ondblclick','ondeactivate','ondrag','ondragend','ondragenter','ondragleave','ondragover','ondragstart','ondrop','onerror','onerrorupdate','onfilterchange','onfinish','onfocus','onfocusin','onfocusout','onhelp','onkeydown','onkeypress','onkeyup','onlayoutcomplete','onload','onlosecapture','onmousedown','onmouseenter','onmouseleave','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel','onmove','onmoveend','onmovestart','onpaste','onpropertychange','onreadystatechange','onreset','onresize','onresizeend','onresizestart','onrowenter','onrowexit','onrowsdelete','onrowsinserted','onscroll','onselect','onselectionchange','onselectstart','onstart','onstop','onsubmit','onunload','javascript','script','eval','behaviour','expression','style','class');  $skipstr
= implode('|', $skipkeys);  $value
= preg_replace(array("/($skipstr)/i"), '.', $value);if (!preg_match("/^[\/|\s]?($allowtags)(\s+|$)/is", $value)) {  $value
= '';  }
  $replaces[]
= empty($value) ? '' : "<" . str_replace('&quot;', '"', $value) . ">";  }
  }
  $html
= str_replace($searchs, $replaces, $html);return $html;  
}
  

//php防注入和XSS攻击通用过滤  
function string_htmlspecialchars($string, $flags = null) {
  if (is_array($string)) {
  foreach ($string as $key => $val) {
  $string[$key] = string_htmlspecialchars($val, $flags);
  }
  } else {
  if ($flags === null) {
  $string = str_replace(array('&', '"', '<', '>'), array('&amp;', '&quot;', '&lt;', '&gt;'), $string);
  if (strpos($string, '&amp;#') !== false) {
  $string = preg_replace('/&amp;((#(\d{3,5}|x[a-fA-F0-9]{4}));)/', '&\\1', $string);
  }
  } else {
  if (PHP_VERSION < '5.4.0') {
  $string = htmlspecialchars($string, $flags);
  } else {
  if (!defined('CHARSET') || (strtolower(CHARSET) == 'utf-8')) {
  $charset = 'UTF-8';
  } else {
  $charset = 'ISO-8859-1';
  }
  $string = htmlspecialchars($string, $flags, $charset);
  }
  }
  }
  return $string;
  
}
  

  
//------------------php防注入和XSS攻击通用过滤-----End--------------------------------------------//
  


PHP中的设置
  PHP5.2以上版本已支持HttpOnly参数的设置,同样也支持全局的HttpOnly的设置,在php.ini中
  

-----------------------------------------------------  session
.cookie_httponly =  
-----------------------------------------------------
  

  设置其值为1或者TRUE,来开启全局的Cookie的HttpOnly属性,当然也支持在代码中来开启:
  

<?php ("session.cookie_httponly", 1);  

// or session_set_cookie_params(0, NULL, NULL, NULL, TRUE);  
?>
  

  Cookie操作函数setcookie函数和setrawcookie函数也专门添加了第7个参数来做为HttpOnly的选项,开启方法为:
  

<?php  

("abc", "test", NULL, NULL, NULL, NULL, TRUE);  

("abc", "test", NULL, NULL, NULL, NULL, TRUE);  

?>  

  老版本的PHP就不说了。没企业用了吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-429551-1-1.html 上篇帖子: everest33 下篇帖子: [PHP] Phalcon操作示范
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表