这里有一个类, 你试试
<?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" => '	',
"\r\n" => '<br />',
"\n" => '<br />',
"\r" => '<br />',
' ' => '  ',
' ' => ' ',
'"' => '"',
'$' => '$',
'&' => '&',
"'" => ''',
'<' => '<',
'>' => '>',
'\\' => '\',
'`' => '`',
); 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;
}
}
?>
<?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" => '	',
"\r\n" => '<br />',
"\n" => '<br />',
"\r" => '<br />',
' ' => '  ',
' ' => ' ',
'"' => '"',
'$' => '$',
'&' => '&',
"'" => ''',
'<' => '<',
'>' => '>',
'\\' => '\',
'`' => '`',
); 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;
}
}
?>
解决方案 »
- 这段php为什么执行完了才在html中显示
- 声音提示问题 急 高手帮帮忙
- 求助一PHP应用mysql问题,关于字段属于哪个表?
- 求一个文字围绕图片网页PHP代码
- 用PHP发邮件,我下了一个SMTP服务器,可是要改变PHP.INI的配置,高手进来坐坐~
- 简单的匹配问题
- 这个正则为什么匹配错误?
- 请教:用php可以得到远程用户的ip,那如何用php得到远程用户的mac地址?
- 请问如何调用上一级目录中的文件?如:include("../top.htm");只是它没有这个功能。
- 在ecmall商品详情页显示收藏数量
- phpcms专题列表分页生成静态出错,动态正常
- Windows server 2003 IIS6.0 搭在PHP 经常出现空白页
最初级的防注入过滤,需要数字用intval过滤,需要字符用addslashes过滤
php的magic quotes gpc开启后自动运行addslashes嵌入将在客户端执行的 Javascript 代码
htmlspecialchars
有些富文本编辑器需要直接显示html标签,这个过滤比较复杂运行各种操作系统命令
这类函数一般直接在php设置中禁止
baogk.php?page=2
baogk.php?page=3这些后面输入特殊符号2楼的很长,我试了下了,好像没得啥用呢4楼解释的很详细,不晓得有没有用,我做做看
高手们继续解答啊 啊啊啊啊
baogk.php?page=2
baogk.php?page=3这些后面输入特殊符号比如反斜杠baogk.php/
baogk.php?page=2/
baogk.php?page=3/就完蛋了