魔术引用跟递归转义

  • 1,337
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');也可以。

weinxin
我的微信
这是我的微信扫一扫
php最后更新:2016-5-30
开拓者博主
  • 本文由 发表于 2016年5月29日22:13:55
  • 转载请务必保留本文链接:https://www.150643.com/22.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: