转义整个post数组需要使用mysql_escape_string吗?

10

我在想是否可以对整个$_POST和$_GET数组使用my_sql_escape_string,这样就不会漏掉任何变量了吗?

不太确定如何测试,否则我自己会测试的。 谢谢!

4个回答

12

我会使用array_walk()函数。它更适合,因为它修改了POST超全局变量,所以将来任何使用都经过了消毒处理。

array_walk_recursive( $_POST, 'mysql_real_escape_string' );

然而,请确保不要仅仅依赖这一行代码来完全保护您的数据库免受攻击。最佳的保护措施是为某些字段限制字符集。例如,电子邮件中不包含引号(因此仅允许字母、数字、@、破折号等),而名称中不包含括号(因此仅允许字母和选定的特殊字符)。

编辑:由于@Johan的建议,将array_walk()更改为array_walk_recursive()。感谢他。


1
没有什么可以完全保护你。我无法脱口而出任何特定的缺陷,会让 mysql_real_escape_string感到担忧。需要记住的一件重要的事情是,它不能(也不应该)用于清理文件上传,因此您需要采取必要的预防措施(防止空字节攻击等)。 - Bailey Parker
4
你应该使用 array_walk_recursive,因为如果任何一个 $_POST 项包含一个数组,这段代码将会失败。 - Johan
@Col.Shrapnel,这不是原帖所问的吗? - Bailey Parker
  1. 不,他没有询问未来的用途。
  2. 即使他问了,一个愚蠢的问题也不能作为给出愚蠢回答的借口。
- Your Common Sense
1
@PhpMyCoder,我认为使用array_walk非常有创意,所以加一分。当然,如果您想在SQL语句中安全地使用它,仍然需要引用数组。像这样:$array = "'".implode("','",$array)."'";应该可以解决问题,尽管那个只适用于一维数组。第二个小问题是更改超级全局变量不是一个好主意。但是,使用$var = $_POST['something']并从那时起使用$var - Johan
显示剩余3条评论

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

虽然,我建议使用 MySQLi


所以你不能修改$_POST变量本身(只是好奇)。比如$_POST = array_map('mysql_real_escape_string',$_POST);?感谢您的建议。这是我第二次听说MySQLi,我会研究一下看看转移有多困难。 - NoviceCoding
@NoviceCoding:你可以这样做,但最好不要污染超级全局变量。 - BoltClock
是的,您可以覆盖 $_POST 变量,但是当您稍后想要使用其中一个原始的、未转义的值时会发生什么呢? :) - Kevin
1
嗯,我会使用array_walk_recursive而不是array_map。_POST可能具有数组值。 - meze
好的,就编码礼仪而言,我明白为什么重复使用 $_POST 是个坏主意,但如果这意味着我必须重命名对 $_POST 的每个调用,那么如果我只是修改 $_POST,什么坏事也不会发生,对吧?不确定它是如何工作的,但 $_POST 会重置,对吗? - NoviceCoding
是的,您可以修改它,这将替换$_POST中的原始值。但并非所有需要引用的变量都来自_POST。也不是所有需要引用的变量。因此,在无法引用字符串时最好使用预处理语句和引用字符串。 - meze

2

您可以使用

foreach(array_keys($_POST) as $key)
{

  $clean[$key] = mysql_real_escape_string($_POST[$key]);

}

接下来,要访问提交的数据,请使用echo $clean['name'];


在使用echo时,应该使用htmlspecialchars()而不是mysql_real_escape_string() - Johan

1
尝试这个。
foreach(array_keys($_GET) as $key){ $_GET[$key] = mysql_real_escape_string($_GET[$key]);}
foreach(array_keys($_POST) as $key){ $_POST[$key] = mysql_real_escape_string($_POST[$key]);}
将 mysql_real_escape_string 整个函数进行转义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,