是有一个更简单的方式安全地提取提交的其他变量于下列方面?

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() 在这方面?)

有帮助吗?

解决方案

要逃避所有变量一气呵成:

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

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

extract($escapedGet);

请不要做,虽然这最后一步。有没有必要,只留下一个数组中的值。提取变量会导致名称冲突与现有的变量,这不仅是一个麻烦和错误的根源,也存在安全隐患的覆盖。此外,作为@BoltClock说,坚持$_GET$_POST。 Also2,如@zerkms指出,有在不应该在数据库查询中使用mysql_real_escaping变量是没有意义的,它甚至可能会导致更多的问题。


请注意,真正的的这是在所有的一个特别好的主意,你只是转世magic_quotes的和global_vars,这是从过去的青睐PHP可怕的做法。使用制备经由库MySQLi或PDO和使用价值通过$_GETfilter_input绑定参数的语句。请参阅 http://www.phptherightway.com

其他提示

您也可以使用一个递归函数这样来实现这一

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);

据我而言Starx”和Ryan的回答从11月19日'10是最好的解决这里我只是需要这个。

当你有一个名称的多个输入字段(例如名称[]),这意味着它们将被保存到$ _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);

消毒或任何验证 INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER, 或 INPUT_ENV, 你可以使用

过滤可以做一个回调,这样你可以提供 mysql_real_escape_string.

这种方法不允许的筛选 $_REQUEST, 因为 你不应该与工作 $_REQUEST 当数据被提供的任何其他超全局变量.它的潜在不安全。

该方法还需要你的名字输入钥匙,所以它不是一个通用的批次过滤。如果你想通用的批量过滤,使用 array_maparray_walkarray_filter 如在其他地方上的这一页。

还有,为什么你使用旧mysql扩展,而不是的 )的预 (i的改进)扩展。所)的预会给你的支持 交易, multiqueries准备好的发言 (其无需逃脱)所有功能,可以使数据库的代码的更多的可靠和安全。

如果您使用的mysqli 扩展,你想逃避所有GET变量:

$escaped_get = array_map(array($mysqli, 'real_escape_string'), $_GET);

作为替代方案,我可以建议你使用 PHP7输入过滤器,这提供了一条捷径,以SQL逸出。我不推荐它本身,而是它的备件产生局部变量:

 $_REQUEST->sql['kkld']

这可以内嵌在SQL查询字符串中使用,并给予额外的警告,你应该忘记它:

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

这是语法有问题,但可以让你逃脱只有那些真正需要它的变量。或者效仿你问什么,用$_REQUEST->sql->always();

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top