当前位置:首页 > PHP教程 > php高级应用 > 列表

谈谈​PHP防止XSS跨站脚本攻击的方法

发布:smiling 来源: PHP粉丝网  添加日期:2022-07-11 11:37:52 浏览: 评论:0 

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 width=250 height=250></iframe> 除了通过正常途径输入XSS攻击字符外,还可以绕过JavaScript校验,通过修改请求达到XSS攻击的目的.

  1. <?php 
  2.  
  3. //php防注入和XSS攻击通用过滤 
  4.  
  5. $_GET     && SafeFilter($_GET); 
  6.  
  7. $_POST    && SafeFilter($_POST); 
  8.  
  9. $_COOKIE  && SafeFilter($_COOKIE); 
  10.  
  11.     
  12.  
  13. function SafeFilter (&$arr)  
  14.  
  15.  
  16.    $ra=Array('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/','/script/','/javascript/','/vbscript/','/expression/','/applet/' 
  17.  
  18.    ,'/meta/','/xml/','/blink/','/link/','/style/','/embed/','/object/','/frame/','/layer/','/title/','/bgsound/' 
  19.  
  20.    ,'/base/','/onload/','/onunload/','/onchange/','/onsubmit/','/onreset/','/onselect/','/onblur/','/onfocus/'
  21.  
  22.    '/onabort/','/onkeydown/','/onkeypress/','/onkeyup/','/onclick/','/ondblclick/','/onmousedown/','/onmousemove/' 
  23.  
  24.    ,'/onmouseout/','/onmouseover/','/onmouseup/','/onunload/'); 
  25.  
  26.        
  27.  
  28.    if (is_array($arr)) 
  29.  
  30.    { 
  31.  
  32.      foreach ($arr as $key => $value)  
  33.  
  34.      { 
  35.  
  36.         if (!is_array($value)) 
  37.  
  38.         { 
  39.  
  40.           if (!get_magic_quotes_gpc())  //不对magic_quotes_gpc转义过的字符使用addslashes(),避免双重转义。 
  41.  
  42.           { 
  43.  
  44.              $value  = addslashes($value); //给单引号(')、双引号(")、反斜线(\)与 NUL(NULL 字符) 
  45.  
  46.              #加上反斜线转义 
  47.  
  48.           } 
  49.  
  50.           $value       = preg_replace($ra,'',$value);     //删除非打印字符,粗暴式过滤xss可疑字符串 
  51.  
  52.           $arr[$key]     = htmlentities(strip_tags($value)); //去除 HTML 和 PHP 标记并转换为 HTML 实体 
  53.  
  54.         } 
  55.  
  56.         else 
  57.  
  58.         { 
  59.  
  60.           SafeFilter($arr[$key]); 
  61.  
  62.         } 
  63.  
  64.      } 
  65.  
  66.    } 
  67.  
  68.  
  69. ?> 
  70.  
  71. $str = 'www.phpfensi.com<meta http-equiv="refresh" content="0;">'
  72.  
  73. SafeFilter ($str); //如果你把这个注释掉,提交之后就会无休止刷新 
  74.  
  75. echo $str
  76.  
  77. //------------------------------php防注入和XSS攻击通用过滤-----Start--------------------------------------------// 
  78.  
  79. function string_remove_xss($html) { 
  80.  
  81.     preg_match_all("/\<([^\<]+)\>/is"$html$ms); 
  82.  
  83.    
  84.  
  85.     $searchs[] = '<'
  86.  
  87.     $replaces[] = '<'
  88.  
  89.     $searchs[] = '>'
  90.  
  91.     $replaces[] = '>'
  92.  
  93.    
  94.  
  95.     if ($ms[1]) { 
  96.  
  97.         $allowtags = 'img|a|font|div|table|tbody|caption|tr|td|th|br|p|b|strong|i|u|em|span|ol|ul|li|blockquote'
  98.  
  99.         $ms[1] = array_unique($ms[1]); 
  100.  
  101.         foreach ($ms[1] as $value) { 
  102.  
  103.             $searchs[] = "<".$value.">"
  104.  
  105.    
  106.  
  107.             $value = str_replace('&''_uch_tmp_str_'$value); 
  108.  
  109.             $value = string_htmlspecialchars($value); 
  110.  
  111.             $value = str_replace('_uch_tmp_str_''&'$value); 
  112.  
  113.    
  114.  
  115.             $value = str_replace(array('\\', '/*'), array('.', '/.'), $value); 
  116.  
  117.             $skipkeys = array('onabort','onactivate','onafterprint','onafterupdate','onbeforeactivate','onbeforecopy','onbeforecut','onbeforedeactivate'
  118.  
  119.                     'onbeforeeditfocus','onbeforepaste','onbeforeprint','onbeforeunload','onbeforeupdate','onblur','onbounce','oncellchange','onchange'
  120.  
  121.                     'onclick','oncontextmenu','oncontrolselect','oncopy','oncut','ondataavailable','ondatasetchanged','ondatasetcomplete','ondblclick'
  122.  
  123.                     'ondeactivate','ondrag','ondragend','ondragenter','ondragleave','ondragover','ondragstart','ondrop','onerror','onerrorupdate'
  124.  
  125.                     'onfilterchange','onfinish','onfocus','onfocusin','onfocusout','onhelp','onkeydown','onkeypress','onkeyup','onlayoutcomplete'
  126.  
  127.                     'onload','onlosecapture','onmousedown','onmouseenter','onmouseleave','onmousemove','onmouseout','onmouseover','onmouseup','onmousewheel'
  128.  
  129.                     'onmove','onmoveend','onmovestart','onpaste','onpropertychange','onreadystatechange','onreset','onresize','onresizeend','onresizestart'
  130.  
  131.                     'onrowenter','onrowexit','onrowsdelete','onrowsinserted','onscroll','onselect','onselectionchange','onselectstart','onstart','onstop'
  132.  
  133.                     'onsubmit','onunload','javascript','script','eval','behaviour','expression','style','class'); 
  134.  
  135.             $skipstr = implode('|'$skipkeys); 
  136.  
  137.             $value = preg_replace(array("/($skipstr)/i"), '.'$value); 
  138.  
  139.             if (!preg_match("/^[\/|\s]?($allowtags)(\s+|$)/is"$value)) { 
  140.  
  141.                 $value = ''
  142.  
  143.             } 
  144.  
  145.             $replaces[] = emptyempty($value) ? '' : "<" . str_replace('"''"'$value) . ">"
  146.  
  147.         } 
  148.  
  149.     } 
  150.  
  151.     $html = str_replace($searchs$replaces$html); 
  152.  
  153.    
  154.  
  155.     return $html
  156.  
  157.  
  158. //php防注入和XSS攻击通用过滤  
  159.  
  160. function string_htmlspecialchars($string$flags = null) { 
  161.  
  162.     if (is_array($string)) { 
  163.  
  164.         foreach ($string as $key => $val) { 
  165.  
  166.             $string[$key] = string_htmlspecialchars($val$flags); 
  167.  
  168.         } 
  169.  
  170.     } else { 
  171.  
  172.         if ($flags === null) { 
  173.  
  174.             $string = str_replace(array('&''"''<''>'), array('&''"''<''>'), $string); 
  175.  
  176.             if (strpos($string'&#') !== false) { 
  177.  
  178.                 $string = preg_replace('/&((#(\d{3,5}|x[a-fA-F0-9]{4}));)/''&\\1'$string); 
  179.  
  180.             } 
  181.  
  182.         } else { 
  183.  
  184.             if (PHP_VERSION < '5.4.0') { 
  185.  
  186.                 $string = htmlspecialchars($string$flags); 
  187.  
  188.             } else { 
  189.  
  190.                 if (!defined('CHARSET') || (strtolower(CHARSET) == 'utf-8')) { 
  191.  
  192.                     $charset = 'UTF-8'
  193.  
  194.                 } else { 
  195.  
  196.                     $charset = 'ISO-8859-1'
  197.  
  198.                 } 
  199.  
  200.                 $string = htmlspecialchars($string$flags$charset); 
  201.  
  202.             } 
  203.  
  204.         } 
  205.  
  206.     } 
  207.  
  208.    
  209.  
  210.     return $string
  211.  
  212.  
  213.  
  214.  
  215. //------------------php防注入和XSS攻击通用过滤-----End--------------------------------------------// 

PHP中的设置

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

-----------------------------------------------------

session.cookie_httponly =

-----------------------------------------------------

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

  1. <?php ini_set("session.cookie_httponly", 1);    
  2.  
  3. // or session_set_cookie_params(0, NULL, NULL, NULL, TRUE);    
  4.  
  5. ?> 

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

  1. <?php   
  2.  
  3. setcookie("abc""test", NULL, NULL, NULL, NULL, TRUE);    
  4.  
  5. setrawcookie("abc""test", NULL, NULL, NULL, NULL, TRUE);   
  6.  
  7. ?>

Tags: PHP跨站脚本攻击 XSS

分享到: