3

除了以下之外,还有更简单的方法可以安全地提取提交的变量吗?

if(isset($_REQUEST['kkld'])) $kkld=mysql_real_escape_string($_REQUEST['kkld']);
if(isset($_REQUEST['info'])) $info=mysql_real_escape_string($_REQUEST['info']);
if(isset($_REQUEST['freq'])) $freq=mysql_real_escape_string($_REQUEST['freq']);

(并且:你会isset()在这种情况下使用吗?)

4

6 回答 6

31

一次性转义所有变量:

$escapedGet = array_map('mysql_real_escape_string', $_GET);

要将所有变量提取到当前命名空间中(即$foo = $_GET['foo']):

extract($escapedGet);

请不要做这最后一步。没有必要,只需将值留在数组中即可。提取变量可能会导致名称冲突和覆盖现有变量,这不仅是麻烦和错误的来源,而且是安全风险。此外,正如@BoltClock 所说,坚持使用$_GETor $_POST。Also2,正如@zerkms 指出的那样,mysql_real_escaping不应该在数据库查询中使用的变量没有意义,它甚至可能导致进一步的问题。


请注意,实际上这根本不是一个特别好的主意,您只是在重生 magic_quotes 和 global_vars,它们是过去很长时间以来可怕的 PHP 实践。通过 mysqli 或 PDO 使用带有绑定参数的准备好的语句,并通过$_GETor使用值filter_input。请参阅http://www.phptherightway.com

于 2010-11-19T07:52:14.123 回答
4

您还可以使用这样的递归函数来完成

function sanitate($array) {
   foreach($array as $key=>$value) {
      if(is_array($value)) { sanitate($value); }
      else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);
于 2010-11-19T07:53:29.120 回答
1

要清理或验证任何INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, or INPUT_ENV,您可以使用

过滤可以通过回调完成,因此您可以提供mysql_real_escape_string.

此方法不允许过滤$_REQUEST,因为当数据在任何其他超全局变量中可用时,您不应该使用。$_REQUEST它可能不安全。

该方法还要求您命名输入键,因此它不是通用的批量过滤。如果您想要通用批量过滤,请使用array_maparray_walkarray_filter,如本页其他地方所示。

另外,为什么要使用旧的 mysql 扩展而不是mysqli(i 表示改进)扩展。mysqli 扩展将为您提供对事务查询和准备好的语句的支持(这消除了转义的需要)所有可以使您的数据库代码更加可靠和安全的功能。

于 2010-11-19T08:10:35.483 回答
0

就我而言,Starx 和 Ryan 在 2010 年 11 月 19 日的回答是这里最好的解决方案,因为我也需要这个。

当您有多个输入字段具有同一个名称(例如名称[])时,这意味着它们将被保存到 $_POST 数组中的一个数组中,您必须使用递归函数,因为 mysql_real_escape_string 不适用于数组。

所以这是逃避这样一个 $_POST 变量的唯一解决方案。

function sanitate($array) {
    foreach($array as $key=>$value) {
        if(is_array($value)) { sanitate($value); }
            else { $array[$key] = mysql_real_escape_string($value); }
   }
   return $array;
}
sanitate($_POST);
于 2015-02-13T13:54:35.573 回答
0

如果你使用mysqli扩展并且你想转义所有 GET 变量:

$escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);
于 2019-04-25T05:31:38.823 回答
-2

作为替代方案,我可以建议您使用PHP7 输入过滤器,它提供了 sql 转义的快捷方式。我不推荐它本身,但它可以避免创建本地化变量:

 $_REQUEST->sql['kkld']

可以在 SQL 查询字符串中内联使用,如果您忘记它会给出额外的警告:

 mysql_query("SELECT x FROM y WHERE z = '{$_REQUEST->sql['kkld']}'");

它在语法上是有问题的,但只允许您转义那些真正需要它的变量。或者模仿你的要求,使用$_REQUEST->sql->always();

于 2010-11-19T09:21:30.293 回答