mysql_real_escape_string()为整个$_REQUEST阵列,或需要通过循环吗?
-
26-09-2019 - |
题
是有一个更简单的方式安全地提取提交的其他变量于下列方面?
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和使用价值通过$_GET
或filter_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
, 你可以使用
filter_input_array
—得到外部变量以及任选筛选他们
过滤可以做一个回调,这样你可以提供 mysql_real_escape_string
.
这种方法不允许的筛选 $_REQUEST
, 因为 你不应该与工作 $_REQUEST
当数据被提供的任何其他超全局变量.它的潜在不安全。
该方法还需要你的名字输入钥匙,所以它不是一个通用的批次过滤。如果你想通用的批量过滤,使用 array_map
或 array_walk
或 array_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();