这次再向大家介绍一个与上次截然不同办法。上次的思路是先判断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语句来写一个函数,可参考本文的第一辑最后那个函数。
小弟又不知天高地厚地献丑了,如有不足请各位前辈多批评指教,不甚感激。

这是防止SI的方法么?@_@
能攻击的还是能攻击呀…攻击不只是过滤插入数据库的数据.
coming —— 2005年06月09日 @8:08 pm
是啊,攻击的途径是有很多种的。要是强的话,攻击数据库也可以不通过Web了啊,比如说其它途径获取服务器权限,然后想做什么就随便了。
phpor —— 2005年06月09日 @10:10 pm
呵呵,多看手册即可
ahu —— 2005年11月23日 @5:03 pm