$_POST = mysql_real_escape_string($_POST);
通过执行此语句,每个帖子值现在是否通过mysql_real_escape_string
转义?这会允许mysql_real_escape_string全局工作吗?
$_POST = mysql_real_escape_string($_POST);
通过执行此语句,每个帖子值现在是否通过mysql_real_escape_string
转义?这会允许mysql_real_escape_string全局工作吗?
不,那根本不起作用:$_POST
是一个数组:mysql_real_escape_string
需要一个字符串作为它的第一个参数。你可以,但是,实现你想要的与array_map
:
$_POST = array_map('mysql_real_escape_string', $_POST);
或者array_walk_recursive
为array_map
在阵列后的值不起作用:
array_walk_recursive($_POST, function(&$v, $k) {$v = mysql_real_escape_string($v);});
更好,但是,这是使用paramaterised查询:此是迄今为止避免SQL注入的最安全的方法。上述选项不仅不需要转义(例如,不需要插入数据库的$_POST
数组的成员),而且还使得难以在其他上下文中使用数据,例如,以某种方式将它们返回给浏览器。
事实上,答案更新以反映这一点,而达米恩的正确答案是积极的。其他警告仍然适用。 – lonesomeday
当然,我认为其他谨慎是真正的谨慎,映射阵列我认为是不治愈的原因,没有银弹。 – hakre
由于$ _POST是一个数组,这会给你一个错误。
链接:http://php.net/manual/en/function.mysql-real-escape-string.php
没有,但你可以使用array_walk()
Docs或array_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。
@hakre谢谢,如果您发现错误,随时编辑我的答案 –
$ 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;
}
此功能不应该被使用,因为它恢复了已经从语言中删除的魔术引号功能。 –
请阅读[常见问题](http://stackoverflow.com/faq)。 – hakre
阅读。感谢您的双重提醒。 – user975096
我认为你正在寻找这样的:[停止SQL注入PHP的最佳途径](http://stackoverflow.com/questions/60174/best-way-to-stop-sql-injection-in-php) – hakre