我已经在 foreach 循环中动态地为 SELECT 查询构建了一个 MySQL WHERE 子句。$_GET
数据来自一个包含许多选择列表的表单,每个选择列表都允许进行多项选择。
例如,如果提交了以下表单数据:
$_GET = Array (
['foo'] => Array ( [0] => a ) ,
['bar'] => Array ( [0] => b, [1] => c) ,
['foobar'] => Array ( [0] => '')
)
使用处理代码:
$whereinitialize = array();
$where = " ";
$whitelist = array ('foo', 'bar', 'foobar');
foreach ($_GET as $key => $values) {
foreach ($values as $value) {
$value = mysql_real_escape_string($value);
$whereinitialize[$key] = isset($whereinitialize[$key]) ? $whereinitialize[$key] : false;
if (in_array($key, $whitelist)) {
if ($value == "") {
$whereinitialize[$key] = "1"." OR ";
} else {
$whereinitialize[$key] .= ("$key = '$value'")." OR ";
}
}
}
}
foreach ($whereinitialize as $v) {
$where .= "(".(rtrim($v, " OR ")).")"." AND ";
}
$where = rtrim($where, " AND ");
我的 WHERE 子句 ( $where
) 然后输出:
(foo = 'a') AND (bar = 'b' OR bar = 'c') AND (1)
从功能上讲,这对我的目的来说工作得很好,但是我已经阅读了各种帖子,表明超全局变量的动态处理充满了安全问题。所以我的问题是,考虑到使用白名单并使用 mysql_real_escape_string 转义数据,上面显示的表单处理动态代码是否可能比按照标准做法单独手动提取和清理每个值更具安全风险?(即$foo = $_GET[‘foo’]
等)