这次再向大家介绍一个与上次截然不同办法。上次的思路是先判断magic_quotes_gpc是on还是off,再跟据情况处理好反斜杠的问题,最后使用户提交的数据原封不动的保存进数据库,这次的思路是,无论如何也加入反斜杠,接着把数据连同反斜杠一起存进MySQL数据库,在提取出来时再去掉。请看代码:

<?php
//如果从表单提交一个变量$_POST['message'],内容为 Tom’s book

//这此加入连接MySQL数据库的代码(略)

//不作判断地在敏感字符前加反斜杠
$_POST['message'] = addslashes($_POST['message'
]);

//把$_POST['message']保存到数据库
//如果magic_quotes_gpc=On,那么存进数据库以后就变成 Tom\’s book
//如果magic_quotes_gpc=Off,那么存进数据库以后就是 Tom’s book
$sql = "INSERT INTO `msg_table` (`id`, `message`) VALUE(‘1′, ‘$_POST[message]‘);"
;
$query = mysql_query($sql
);
?>

  好了,如果现在的magic_quotes_gpc=Off的话就最好不过了,因为保存的数据和用户提交的一模一样。

  但如果magic_quotes_gpc=On的话,由于加了两次反斜杠,所以保存后会发现所有的敏感字符前多了一个反斜杠。不用急,我们在输出的时候只要使用stripslashes()函数处理一下就行了,而且也是不用判断的。请看代码:

<?php
//这此加入连接MySQL数据库的代码(略)

//从数据库中提取刚才那条数据
$sql = "SELECT * FROM `msg_table` WHERE `id` = ‘1′;"
;
$query = mysql_query($sql
);
$result = mysql_fetch_array($query
);

//去除所有敏感字符前的反斜杠
$result['message'] = stripslashes($result['message'
]);

//输出的结果为 Tom’s book
echo $result['message'
];
?>

  stripslashes()函数可以去除敏感字符前的反斜杠。当然,没有反斜杠的就不会处理了,也就是magic_quotes_gpc=Off的时候。

  当有多个变量在处理的时候,你可以用foreach语句来写一个函数,可参考本文的第一辑最后那个函数。

  小弟又不知天高地厚地献丑了,如有不足请各位前辈多批评指教,不甚感激。


3条评论

  1. 这是防止SI的方法么?@_@

    能攻击的还是能攻击呀…攻击不只是过滤插入数据库的数据.

  2. 是啊,攻击的途径是有很多种的。要是强的话,攻击数据库也可以不通过Web了啊,比如说其它途径获取服务器权限,然后想做什么就随便了。

  3. 呵呵,多看手册即可

发表评论

评论也有版权!

click to change验证码