跨站脚本攻击(XSS)漏洞 修复方法

跨站脚本攻击(XSS)漏洞
漏洞描述:
目标存在跨站脚本攻击。
1.跨站脚本攻击就是指恶意攻击者向网页中插入一段恶意代码,当用户浏览该网页时,嵌入到网页中的恶意代码就会被执行。
2.跨站脚本攻击漏洞,英文名称Cross Site Scripting,简称CSS又叫XSS。它指的是恶意攻击者向Web页面中插入一段恶意代码,当用户浏览该页面时,嵌入到Web页面中的恶意代码就会被执行,从而达到恶意攻击者的特殊目的。

危害:
1.恶意用户可以使用该漏洞来盗取用户账户信息、模拟其他用户身份登录,更甚至可以修改网页呈现给其他用户的内容。
2.恶意用户可以使用JavaScript、VBScript、ActiveX、HTML语言甚至Flash应用的漏洞来进行攻击,从而来达到获取其他的用户信息目的。

修复方法:
方法一:站在安全的角度看,必须过滤用户输入的危险数据,默认用户所有的输入数据都是不安全的,请根据自身网站程序做代码修改。
方法二:使用360防跨站攻击脚本。( 需要站长懂得编程并且能够修改服务器代码 )
这里列出PHP站点防护脚本,新建文件xss.php:

  1. < ?php  
  2. //Code By Safe3   
  3. //Add HTTP_REFERER by D.  
  4. $referer=emptyempty($_SERVER['HTTP_REFERER']) ? array() : array($_SERVER['HTTP_REFERER']);  
  5. function customError($errno$errstr$errfile$errline)  
  6. {   
  7.   echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />";  
  8.   die();  
  9. }  
  10. set_error_handler("customError",E_ERROR);  
  11. $getfilter="'|\b(alert|confirm|prompt)\b|<[^>]*?>|^\\+\/v(8|9)|\\b(and|or)\\b.+?(>|<|=|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";  
  12. $postfilter="^\\+\/v(8|9)|\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|<\\s*img\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";  
  13. $cookiefilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";  
  14. function StopAttack($StrFiltKey,$StrFiltValue,$ArrFiltReq){    
  15.   
  16.   $StrFiltValue=arr_foreach($StrFiltValue);  
  17.   if (preg_match("/".$ArrFiltReq."/is",$StrFiltValue)==1){     
  18.       //slog("  
  19.   
  20. 操作IP: ".$_SERVER["REMOTE_ADDR"]." 
  21. 操作时间: ".strftime("%Y-%m-%d %H:%M:%S")." 
  22. 操作页面:".$_SERVER["PHP_SELF"]." 
  23. 提交方式: ".$_SERVER["REQUEST_METHOD"]." 
  24. 提交参数: ".$StrFiltKey." 
  25. 提交数据: ".$StrFiltValue);  
  26.       print "<script type='text/javascript'> alert('您提交的数据带有不合法的参数,请重新输入!\\r\\r感谢您对未来往事的支持~\(≧▽≦)/~啦啦啦');history.go(-1);</script>";  
  27.       exit();  
  28.   }  
  29.   if (preg_match("/".$ArrFiltReq."/is",$StrFiltKey)==1){     
  30.       //slog("  
  31.   
  32. 操作IP: ".$_SERVER["REMOTE_ADDR"]." 
  33. 操作时间: ".strftime("%Y-%m-%d %H:%M:%S")." 
  34. 操作页面:".$_SERVER["PHP_SELF"]." 
  35. 提交方式: ".$_SERVER["REQUEST_METHOD"]." 
  36. 提交参数: ".$StrFiltKey." 
  37. 提交数据: ".$StrFiltValue);  
  38.       print "<script type='text/javascript'> alert('您提交的数据带有不合法的参数,请重新输入!\\r\\r感谢您对未来往事的支持~\(≧▽≦)/~啦啦啦');history.go(-1);</script>";  
  39.       exit();  
  40.   }    
  41. }    
  42. //$ArrPGC=array_merge($_GET,$_POST,$_COOKIE);  
  43. foreach($_GET as $key=>$value){   
  44.   StopAttack($key,$value,$getfilter);  
  45. }  
  46. foreach($_POST as $key=>$value){   
  47.   StopAttack($key,$value,$postfilter);  
  48. }  
  49. foreach($_COOKIE as $key=>$value){   
  50.   StopAttack($key,$value,$cookiefilter);  
  51. }  
  52. foreach($referer as $key=>$value){   
  53.   StopAttack($key,$value,$getfilter);  
  54. }  
  55.   
  56. function slog($logs)  
  57. {  
  58.   $toppath=$_SERVER["DOCUMENT_ROOT"]."/log.htm";  
  59.   $Ts=fopen($toppath,"a+");  
  60.   fputs($Ts,$logs."\r\n");  
  61.   fclose($Ts);  
  62. }  
  63. function arr_foreach($arr) {  
  64.   static $str;  
  65.   if (!is_array($arr)) {  
  66.   return $arr;  
  67.   }  
  68.   foreach ($arr as $key => $val ) {  
  69.   
  70.   if (is_array($val)) {  
  71.   
  72.     arr_foreach($val);  
  73.   } else {  
  74.   
  75.     $str[] = $val;  
  76.   }  
  77.   }  
  78.   return implode($str);  
  79. }  
  80. ?>  


使用方法:
在所需要防护的页面加入代码

require_once('xss.php');   //如果想整站防注,需要加入到站点公共调用文件中。

本文最后更新于 2012-09-25 00:19:22 并被添加「web安全 php过滤」标签,已有 33910 位童鞋阅读过。
本文作者:未来往事
本站使用「署名 4.0 国际」创作共享协议,可自由转载、引用,但需署名作者且注明文章出处

相关文章

已有 2 条评论
  1. 神经大爆炸

    第一种方法  如何过滤?

    神经大爆炸 error: 102
    1. Rinald

      @神经大爆炸

      你可以自行定义一个过滤的方法。例如:http://blog.www.fity.cn/post/424/

      Rinald error: 102

此处评论已关闭