2013-06-09 3 views
1

Я построил предложение 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’] и т. д.)

+0

Потому что у вас есть белый список для ключей, и вы используете real_escape_string на ваши ценности ваш код безопасным – chrislondon

+0

@chrislondon. Благодарю. Кажется, что существует много колебаний в динамических формах обработки, как по соображениям безопасности, так и по соображениям считывания кода. Возможно, что-то может легко проскочить между пробелами? – user2468499

+1

Да, это очень легко, когда вещи проваливаются сквозь трещины. Две большие вещи: 1) не помещать данные пользователя прямо в запросы, не выполняя 'mysqli_real_escape_string()' и 2) не возвращать им обратно данные пользователя на странице, не делая 'htmlspecialchars()' – chrislondon

ответ

-1

Предлагаю вам использовать подготовленные заявления PDO. Не используйте функцию mysql больше, не только PDO имеет больше возможностей по сравнению с простым mysql, но и в новых версиях PHP mysql_ * функции будут устаревать.

В PDO, вы можете использовать подготовленные операторы, и вам не нужно будет беспокоиться о SQL-инъекции, l, поскольку параметры, которые вы хотите передать методу базы данных, чтобы делать с ними в базе данных, будут дезинфицировать, что-то для вас и облегчает жизнь.

Вот ссылка на PDO в PHP: http://php.net/manual/en/book.pdo.php и вот о подготовленных заявлений: http://php.net/manual/en/pdo.prepared-statements.php

+0

Спасибо, l «Посмотрите в PDO немедленно. – user2468499

Смежные вопросы