2011-10-03 50 views
0
$_POST = mysql_real_escape_string($_POST); 

通过执行此语句,每个帖子值现在是否通过mysql_real_escape_string转义?这会允许mysql_real_escape_string全局工作吗?

+0

请阅读[常见问题](http://stackoverflow.com/faq)。 – hakre

+0

阅读。感谢您的双重提醒。 – user975096

+0

我认为你正在寻找这样的:[停止SQL注入PHP的最佳途径](http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – hakre

回答

4

不,那根本不起作用:$_POST是一个数组:mysql_real_escape_string需要一个字符串作为它的第一个参数。你可以,但是,实现你想要的与array_map

$_POST = array_map('mysql_real_escape_string', $_POST); 

或者array_walk_recursivearray_map在阵列后的值不起作用:

array_walk_recursive($_POST, function(&$v, $k) {$v = mysql_real_escape_string($v);}); 

更好,但是,这是使用paramaterised查询:此是迄今为止避免SQL注入的最安全的方法。上述选项不仅不需要转义(例如,不需要插入数据库的$_POST数组的成员),而且还使得难以在其他上下文中使用数据,例如,以某种方式将它们返回给浏览器。

+0

事实上,答案更新以反映这一点,而达米恩的正确答案是积极的。其他警告仍然适用。 – lonesomeday

+0

当然,我认为其他谨慎是真正的谨慎,映射阵列我认为是不治愈的原因,没有银弹。 – hakre

3

没有,但你可以使用array_walk()Docsarray_walk_recursive()Docs实现这一目标,作为mysql_real_escape_string()Docs需要一个字符串(去图...)作为输入,而你传递一个数组来代替。 有了这个,你通过每个数组元素相同的回调函数:

array_walk_recursive($_POST, 'escape'); 

escape($k,$v) 
{ 
return mysql_real_escape_string($v); 
} 

但最好相应对待每一个值,为前。将INT转换为INT等,或者更好,use parametrized queries

+0

@hakre谢谢,如果您发现错误,随时编辑我的答案 –

-2

$ escapedPost = array_map(array($ this,'recursive_escape'),$ _POST);

/** 
* recursively escape an array containing strings and/or arrays 
*/ 
function recursive_escape($value) { 
    if (is_array($value)) { 
     array_map(array($this, 'recursive_escape'), $value); 
    } else { 
     $value = mysql_real_escape_string($value); 
    } 
    return $value; 
} 
+1

此功能不应该被使用,因为它恢复了已经从语言中删除的魔术引号功能。 –