一个全面的PHP整站防注入程序代码

来源:互联网 发布:4g网络制式有哪些 编辑:程序博客网 时间:2024/06/05 19:46
这是一个考虑比较全面的php和sql结合的防注入程序,在php方便主要对get,post,cooke,files进行了过滤,在sql中我们就对delete,update一些查询命令进行检测过滤。

SQL注入攻击的总体思路

·发现SQL注入位置; 
·判断后台数据库类型; 
·确定XP_CMDSHELL可执行情况 
·发现WEB虚拟目录 
·上传ASP,php,jsp木马; 
·得到管理员权限;


<?PHP 
//PHP整站防注入程序,需要在公共文件中require_once本文件 
//判断magic_quotes_gpc状态

 代码如下复制代码if (@get_magic_quotes_gpc ()) { 
$_GET = sec ( $_GET ); 
$_POST = sec ( $_POST ); 
$_COOKIE = sec ( $_COOKIE ); 
$_FILES = sec ( $_FILES ); 

$_SERVER = sec ( $_SERVER ); 
function sec(&$array) { 
//如果是数组,遍历数组,递归调用 
if (is_array ( $array )) { 
foreach ( $array as $k => $v ) { 
$array [$k] = sec ( $v ); 

} else if (is_string ( $array )) { 
//使用addslashes函数来处理 
$array = addslashes ( $array ); 
} else if (is_numeric ( $array )) { 
$array = intval ( $array ); 

return $array; 
}

1、整型参数的判断

当输入的参数YY为整型时,通常abc.asp中SQL语句原貌大致如下: 
select * from 表名 where 字段=YY,所以可以用以下步骤测试SQL注入是否存在。 
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了 
select * from 表名 where 字段=YY’,abc.asp运行异常; 
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1, abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同; 
③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2, abc.asp运行异常; 
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

综合上面我们写一个整型过滤函数

 代码如下复制代码

function num_check($id) { 
if (! $id) { 
die ( '参数不能为空!' ); 
} //是否为空的判断 
else if (inject_check ( $id )) { 
die ( '非法参数' ); 
} //注入判断 
else if (! is_numetic ( $id )) { 
die ( '非法参数' ); 

//数字判断 
$id = intval ( $id ); 
//整型化 
return $id; 
}


//字符过滤函数 
function str_check($str) { 
if (inject_check ( $str )) { 
die ( '非法参数' ); 

//注入判断 
$str = htmlspecialchars ( $str ); 
//转换html 
return $str; 

function search_check($str) { 
$str = str_replace ( "_", "_", $str ); 
//把"_"过滤掉 
$str = str_replace ( "%", "%", $str ); 
//把"%"过滤掉 
$str = htmlspecialchars ( $str ); 
//转换html 
return $str; 

//表单过滤函数 
function post_check($str, $min, $max) { 
if (isset ( $min ) && strlen ( $str ) < $min) { 
die ( '最少$min字节' ); 
} else if (isset ( $max ) && strlen ( $str ) > $max) { 
die ( '最多$max字节' ); 

return stripslashes_array ( $str ); 
}

当输入的参数YY为字符串时,通常abc.asp中SQL语句原貌大致如下: 
select * from 表名 where 字段='YY',所以可以用以下步骤测试SQL注入是否存在。 
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了 
select * from 表名 where 字段=YY’,abc.asp运行异常; 
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='1', abc.asp运行正常,而且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同; 
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&;nb ... 39;1'='2', abc.asp运行异常; 
如果以上三步全面满足,abc.asp中一定存在SQL注入漏洞。

 

 代码如下复制代码

//防注入函数 
function inject_check($sql_str) { 
return eregi ( 'select|inert|update|delete|'|/*|*|../|./|UNION|into|load_file|outfile', $sql_str ); 
// www.ittianxia.com 进行过滤,防注入 
}

function stripslashes_array(&$array) { 
if (is_array ( $array )) { 
foreach ( $array as $k => $v ) { 
$array [$k] = stripslashes_array ( $v ); 

} else if (is_string ( $array )) { 
$array = stripslashes ( $array ); 

return $array; 
}

?>

好了文章介绍到的防注入也算是比较全面的,大家可以测试或更出更好的方法.

本文章来自 IT天下 原文链接:http://www.ittianxia.com/program/php/1520.html

原创粉丝点击