del.php?id=3 sql='delete from news where id='.$_GET['id']'; del.php?id=3 or 1;
这时$sql='delete from news where id=3 or 1'
这样所有的新闻都会被删除.
addslashes 可以对某个变量进行转义,
但是,$_POST是一个数组,可以有多个单元,
如果每个单元手动的addslashes来转义,工作量大.
有什么办法可以对$_POST数组的每个单元进行转义?
addslashes($str);
特点:只能对单个的字符串转义,遇到多维数组就没有作用了。
插播一个小题目
$arr=array(1,2,3,4,);//用foreach遍历 来处理$arr foreach ($arr as $k => $v) { $arr[$k]=2 * $v; } print_r($arr); //$k => $v 键与值 Array ( [0] => 2 [1] => 4 [2] => 6 [3] => 8 )
//回到POST循环进行转义
$_POST=array('age'=>28,'name'=>'abc"'); foreach ($_POST as $k => $v) { if (is_string($v)) {//is_string()检测变量是否是字符串 $_POST[$k]=addslashes($v); } } print_r($_POST); //Array ( [age] => 28 [name] => abc\" )
POST正常转义,来到GET
$_GET=array('id'=>5,'gender'=>'m"','user'=>array('name'=>'lisi','area'=>'bj"')); foreach($_GET as $k=>$v){ if (is_string($v)) { $_GET[$k]=addslashes($v); } } print_r($_GET); /* Array ( [id] => 5 [gender] => m\" [user] => Array ( [name] => lisi [area] => bj" ) ) [gender] => m\" 被转义了 数组内的 [area] => bj"未被转义 我们用array_walk_recursive,递归处理数组单元的函数 函数本身只有一个功能,带着写的函数到数组个单元走一遍,自然各单元就被转义了 */ function abc(&$v,$k){ $v=addslashes($v); } array_walk_recursive($_GET, 'abc'); print_r($_GET); /* Array ( [id] => 5 [gender] => m\" [user] => Array ( [name] => lisi [area] => bj" ) ) Array ( [id] => 5 [gender] => m\\\" [user] => Array ( [name] => lisi [area] => bj\" ) ) */
转义成功
$_GET=array('id'=>5,'gender'=>'m"','user'=>array('name'=>'lisi','area'=>'bj"')); function abc(&$v,$k){ $v=addslashes($v); } array_walk_recursive($_GET, 'abc'); print_r($_GET); /* Array ( [id] => 5 [gender] => m\" [user] => Array ( [name] => lisi [area] => bj\" ) ) */
附:
防止SQL注入(对客户传递的信息不能相信,要通过转义才能使用)
1.addslashes($str);
特点:只能对单个的字符串转义,遇到多维数组就没有作用了。
2.mysql_escape_string();
特点:同上
3.array_walk_recursive — 对数组中的每个成员递归地应用用户函数
// 合理的判断及转义 //如果魔术引号开启就不需要用addslashes进行转义,如果没有开启则需要转义,此时要做如下的判断 if(!get_magic_quotes_gpc()) { // 如果魔术引号没开 function _addslashes(&$v,$k) { $v = addslashes($v); } array_walk_recursive(&$_GET,'_addslashes'); 转义get过来的值 array_walk_recursive(&$_POST,'_addslashes'); 转义post过来的值 array_walk_recursive(&$_COOKIE,'_addslashes'); 转义cookie的值 }
get_magic_quotes_gpc();判断php.ini配置文件中魔术引号是否开启。
开启魔术引号的方法:在php.ini文件中将magic_quotes_gpc的值改为on即可。
或者在文件中动态的更改:int_set('magic_quotes_gpc','on');也可以。

我的微信
这是我的微信扫一扫