Я построил предложение MySQL WHERE для запроса SELECT динамически в цикле foreach. Данные $_GET
поступают из формы, содержащей многочисленные списки выбора, каждый из которых допускает множественный выбор.Санитация динамического предложения MySQL WHERE в PHP
Например, если следующий вид данные представлены:
$_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
) затем выводит:
(foo = 'a') AND (bar = 'b' OR bar = 'c') AND (1)
Функционально , это отлично работает для моих целей, однако я читал различные сообщения, предлагающие что динамическая обработка суперглобалов чревата проблемами безопасности. Поэтому мой вопрос заключается в том, что с учетом использования белого списка и избежания данных с использованием mysql_real_escape_string приведенный выше динамический код обработки формы, скорее всего, будет более опасным для безопасности, чем ручное извлечение и дезинфекция каждого значения по отдельности в соответствии со стандартной практикой? (то есть $foo = $_GET[‘foo’]
и т. д.)
Потому что у вас есть белый список для ключей, и вы используете real_escape_string на ваши ценности ваш код безопасным – chrislondon
@chrislondon. Благодарю. Кажется, что существует много колебаний в динамических формах обработки, как по соображениям безопасности, так и по соображениям считывания кода. Возможно, что-то может легко проскочить между пробелами? – user2468499
Да, это очень легко, когда вещи проваливаются сквозь трещины. Две большие вещи: 1) не помещать данные пользователя прямо в запросы, не выполняя 'mysqli_real_escape_string()' и 2) не возвращать им обратно данные пользователя на странице, не делая 'htmlspecialchars()' – chrislondon