这里有一个类, 你试试
<?php
//Cleaner::clean_input();
/**
 * 清空提交信息
 * 
 * @author  Zerolone
 * @version 2011-1-5 12:00:54
 *
 */
class RequestCleaner{
  //1、先替换双空格再替换单空格既可以保证显示连续空格,又不会出现超长行不能换行的问题;
  //2、\r\n 一定要在 \r 和 \n 之前优先被替换
  private static $replace=array(
"\t"   => '&#9;', 
"\r\n" => '<br />', 
"\n"   => '<br />', 
"\r"   => '<br />',
'  '   => '&#32; ',
' '    => '&#32;', 
'"'    => '"', 
'$'    => '&#36;', 
'&'    => '&', 
"'"    => '&#39;',
'<'    => '&lt;',
'>'    => '&gt;',
'\\'   => '&#92;', 
'`'    => '&#96;',
  );  private static function clean_str(&$str){
    if(preg_match('/[\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F\\x7F]/S',$str)) $str=''; //这些非打印字符不应该出现!视为攻击,直接清空!
    else $str=strtr(trim($str),self::$replace); //返回值一定是字符串,至多是 ''
  }  private static function clean_key(&$arr)
  {
    $keys=array_keys($arr);
    foreach($keys as $k) if(is_string($k))
    {//由于仅处理字符串键,所以键顺序会被打乱[字符串键全跑到整数键后面去了]
      $tmp=$arr[$k];
      unset($arr[$k]);
      self::clean_str($k);
      if(''!==$k) $arr[$k]=$tmp;
    }
  }  private static function clean_REQUEST(&$arr) {
    if(is_array($arr)) {
      self::clean_key($arr);
      $keys=array_keys($arr);
      foreach($keys as $k) self::clean_REQUEST($arr[$k]);
    }
    elseif(is_string($arr)) self::clean_str($arr);
  }
  
  private static function clean_ONE_FILE($finfo, &$name, &$type, &$tmp_name, &$error, &$size){
    //所有传入的引用变量的嵌套结构都是相同的
    if(is_array($name)){
      //虽然键顺序被打乱,但是对应关系依然正确
      self::clean_key($name);
      self::clean_key($type);
      self::clean_key($tmp_name);
      self::clean_key($error);
      self::clean_key($size);
      $keys=array_keys($name);
      foreach($keys as $k) self::clean_ONE_FILE($finfo, $name[$k], $type[$k], $tmp_name[$k], $error[$k], $size[$k]);
    } else {
      $name=basename($name);
      self::clean_str($name);
      self::clean_str($type);
      if(UPLOAD_ERR_OK==$error){
        //仅纠正上传成功的文件TYPE
        if($mime=finfo_file($finfo, $tmp_name)){
          //成功获取正确的MIME类型,纠正客户端输入
          $pos=strpos($mime,';');
          $type=$pos?substr($mime,0,$pos):$mime;
        }else{
          //不能识别MIME,客户端在欺骗
          $type='MIME_CHEAT';
          $error=UPLOAD_ERR_PARTIAL;
        }
      }
    }
  }  private static function clean_FILES(){
    self::clean_key($_FILES);
    $keys=array_keys($_FILES);
    $finfo=finfo_open(FILEINFO_MIME);
    foreach($keys as $k) self::clean_ONE_FILE($finfo, $_FILES[$k]['name'], $_FILES[$k]['type'], $_FILES[$k]['tmp_name'], $_FILES[$k]['error'], $_FILES[$k]['size']);
    finfo_close($finfo);
  }  private static $uncleaned=TRUE;
  
  /**
   * 清除所有不正常的输入
   */
  public static function clean_input(){
    if(self::$uncleaned){
      if(!empty($_GET))     self::clean_REQUEST($_GET);
      if(!empty($_POST))    self::clean_REQUEST($_POST);
      if(!empty($_COOKIE))  self::clean_REQUEST($_COOKIE);
      if(!empty($_REQUEST)) self::clean_REQUEST($_REQUEST);
      if(!empty($_SERVER))  self::clean_REQUEST($_SERVER);
      if(!empty($_FILES))   self::clean_FILES();
    }
    self::$uncleaned=FALSE;
  }
}
?>

解决方案 »

  1.   

    如果你的网站简单到不需要任何参数,用rewrite把所有xxx.php.*重写到xxx.php启动任意 SQL 查询
    最初级的防注入过滤,需要数字用intval过滤,需要字符用addslashes过滤
    php的magic quotes gpc开启后自动运行addslashes嵌入将在客户端执行的 Javascript 代码
    htmlspecialchars
    有些富文本编辑器需要直接显示html标签,这个过滤比较复杂运行各种操作系统命令
    这类函数一般直接在php设置中禁止
      

  2.   

    要防止baogk.php
    baogk.php?page=2
    baogk.php?page=3这些后面输入特殊符号2楼的很长,我试了下了,好像没得啥用呢4楼解释的很详细,不晓得有没有用,我做做看
    高手们继续解答啊 啊啊啊啊
      

  3.   

    baogk.php
    baogk.php?page=2
    baogk.php?page=3这些后面输入特殊符号比如反斜杠baogk.php/
    baogk.php?page=2/
    baogk.php?page=3/就完蛋了
      

  4.   

    听别人说,跨站脚本攻击漏洞XSS,叫这个。
      

  5.   

    这个明显和PHP文件后面带不带参数没关系,而是你没有对参数进行处理