我主要想让大家挑挑这段代码功能上的不足,谢谢<?php
//SQL注入检测过滤程序代码:foreach ($_GET as $get_key=>$get_var)
{
if (is_numeric($get_var)) {
$get[strtolower($get_key)] = get_int($get_var);
} else {
$get[strtolower($get_key)] = get_str($get_var);
$get[strtolower($get_key)]=str_replace("%","\%",$get[strtolower($get_key)]);
$get[strtolower($get_key)]=trim($get[strtolower($get_key)]);
}
}
/* 过滤所有POST过来的变量 */
foreach ($_POST as $post_key=>$post_var)
{
if (is_numeric($post_var)) {
$post[strtolower($post_key)] = get_int($post_var);
} else {
$post[strtolower($post_key)] = get_str($post_var);
}
}
/* 过滤函数 */
//整型过滤函数
function get_int($number)
{
return intval($number);
}
//字符串型过滤函数
function get_str($string)
{
if (!get_magic_quotes_gpc()) {
return addslashes($string);
}
return $string;
} //SQL注入检测过滤程序代码 END?>
//SQL注入检测过滤程序代码:foreach ($_GET as $get_key=>$get_var)
{
if (is_numeric($get_var)) {
$get[strtolower($get_key)] = get_int($get_var);
} else {
$get[strtolower($get_key)] = get_str($get_var);
$get[strtolower($get_key)]=str_replace("%","\%",$get[strtolower($get_key)]);
$get[strtolower($get_key)]=trim($get[strtolower($get_key)]);
}
}
/* 过滤所有POST过来的变量 */
foreach ($_POST as $post_key=>$post_var)
{
if (is_numeric($post_var)) {
$post[strtolower($post_key)] = get_int($post_var);
} else {
$post[strtolower($post_key)] = get_str($post_var);
}
}
/* 过滤函数 */
//整型过滤函数
function get_int($number)
{
return intval($number);
}
//字符串型过滤函数
function get_str($string)
{
if (!get_magic_quotes_gpc()) {
return addslashes($string);
}
return $string;
} //SQL注入检测过滤程序代码 END?>
return addslashes($string);
}
sql可快应该不会被注入
你的代码本身就有些地方需要多考虑,比如,id=9.5, 你过滤后成了9,
code=0x4, 你过滤后成了0
....等另外,get/post都是可以输入数组的, 但是显然你都过滤成了字符串....------------------再说注入,
其实防注入更主要的地方是sql的写法比如说:
xxx.php?id=3 你得到 $id=3然后你写
select * from xxx where id={$id} 然后别人输入 xxx.php?id=3+or+1你的过滤没有改变它于是sql成了 select * from xxx where id=3 or 1所有的记录都将返回(虽然这不一定造成什么后果,但是过滤没有起作用)--------------------------------------------------关于注入和addslashes,1.个人不建议使用addslashes对post/get做处理,因为输出时需要转回头,很烦,
有时数据压根不会进sql, 所以没必要
我的做法是保持输入字符串原样,在sql语句里做mysql_real_escape_string2.对输入的类型和值范围做严格检查,
比如该输入id的地方,intval($_GET['id']),
不是根据输入的值判断,而是根据你要如何使用它判断
一个id,不能因为别人输入了string,你就当string处理一个性别id, 如果1=男,2=女,那么别人输了3, 也要过滤掉
<?php
function check_input($value)
{
// 去除斜杠
if (get_magic_quotes_gpc())
{
$value = stripslashes($value);
}
// 如果不是数字则加引号
if (!is_numeric($value))
{
$value = "'" . mysql_real_escape_string($value) . "'";
}
return $value;
}$con = mysql_connect("localhost", "hello", "321");
if (!$con)
{
die('Could not connect: ' . mysql_error());
}// 进行安全的 SQL
$user = check_input($_POST['user']);
$pwd = check_input($_POST['pwd']);
$sql = "SELECT * FROM users WHERE
user=$user AND password=$pwd";mysql_query($sql);mysql_close($con);
?>