我记得我之前做一个项目.就给检测出存在XSS攻击。开始我没有过滤提交的内容。后来foreach 循环过滤每一个变量$_GET...$_POST...,发现不行。然后只好写了个函数 直接检测 $_SERVER["SERVER_NAME"] . $_SERVER["REQUEST_URI"] 判断直接 exit...不知道大家都是怎么处理这个问题的...

解决方案 »

  1.   

    本帖最后由 PhpNewnew 于 2012-08-10 22:00:38 编辑
      

  2.   


    没用是什么意思。。就是<>'"这些东西变成HTML实体再输出到页面就不会被当作HTML内容解析了, 没其他东西吧.
      

  3.   

    你用
    foreach($_GET as &$value){
    $value=htmlspecialchars($value);}这样来过滤?
      

  4.   

    <?php
    $array = array("hello"=>"dsa<>");
    foreach($array as &$value){     
    $value = htmlspecialchars($value);
    }
    var_dump($array);
    array(1) {
      ["hello"]=>
      &string(11) "dsa&lt;&gt;"
    }
    这样行啊
      

  5.   

    开始我是这么做的,但是检测不通过.
    代码如下
    //攻击代码
    //http://localhost/test.php/'>" ></script ><script > alert(1)</script >/?id=21050944//这里做检测
    foreach($_GET as xxx) ....
    $gif = './images/text.gif';echo "<img src='{$gif}'>";//然后看下img的src...
    虽然没有弹出alert 但是安全检测说没有通过XSS的安全检测...
    我就郁闷了
      

  6.   

    给你这三个函数,你根据需求稍加修改就好了,以后要获取内容的时候不管是get还是post传值都用这样的方法来获取:
    $变量名=Toget('参数名或表单内的项目名');
    //函数:获取数据
    //参数:表单名,是否需要转译
    Function Toget($__k,$Slash=True){
    IF($__k==""){Return False;} IF(Array_key_exists($__k,$_REQUEST)){
    $Value=IsSet($_POST["".$__k.""])?$_POST["".$__k.""]:$_GET["".$__k.""];
    }Else{
    Return False;
    } IF(Is_array($Value)){
    $Value=Array_Filter($Value,'_nul');
    }Else{
    $Value=Trim($Value);
    IF($Value==""){Return False;}
    } IF($Slash){
    $Value=Addlash($Value);
    } //反馈结果
    IF(Is_array($Value)){Return $Value;}
    IF($Value=="" Or !Isset($Value)){
    Return False;
    }Else{
    Return $Value;
    }
    }
    function Addlash($Str){
    !Defined('MAGIC_QUOTES_GPC') && Define('MAGIC_QUOTES_GPC',get_magic_quotes_gpc());
    IF(!MAGIC_QUOTES_GPC){
    IF(Is_array($Str)){
    $keys=array_keys($Str);
    Foreach($keys as $key){
    $val=$Str[$key];unset($Str[$key]);
    $Str[addslashes($key)]=Addlash($val);
    }
    }Else{
    $Str=addslashes($Str);
    }
    }
    Return $Str;
    }//清理数组中的空值
    //用法:Print_r (Array_Filter($Arr,'_nul'));
    Function _nul($param){
    Return ($param!="") ? True : False;
    }
      

  7.   

    好,先谢了... 不过我比较奇怪的是 我7楼的代码 img src 是怎么会给X进去的.
      

  8.   

    XSS又叫CSS (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意脚本代码,当用户浏览该页之时,嵌入其中Web里面的脚本代码会被执行,从而达到恶意攻击用户的特殊目的。XSS属于被动式的攻击,因为其被动且不好利用,所以许多人常忽略其危害性。服务器端脚本防止 XSS 的唯一手段是检查传入的数据中是否有 script 标记
    当然,攻击者还有 n 多的手段去直接在你的页面中嵌入恶意代码。这就不是服务器端脚本能解决的问题了
    简单的用 htmlspecialchars 处理一下,只适合于其后只将传入的数据作为字符串显示的场合。
    由于 <script 可以用回车、换行、制表都字符隔开,而不影响代码的执行。所以判断是否存在 XSS 威胁需要使用“串的最大匹配算法”。对于 #7 的 <img src
    显然使用的检测算法不是最大匹配算法,而是简单的包含算法
    虽无大错,但误判率升高。宁可错杀三千,不可放过一个
      

  9.   

    嗯,看样子是检测过于严格了。不过也没办法,别人这么要求宁可误判也得遵守它的结果。申诉无效..那就只好用我的土方法直接exit.
      

  10.   

    为什么我这边测试,尽然是这样的。
    array(1) { ["hello"]=> &string(11) "dsa<>" }