Одиночные кавычки экранируются автоматически в PHP?Тогда что нужно для очистки? - PullRequest
3 голосов
/ 15 июня 2011

Я читаю о веб-безопасности, и одна очевидная тема для обсуждения - SQL-инъекции . Я пытаюсь настроить базовую страницу PHP, где я могу выполнить SQL-инъекцию (это локальный сервер). Однако, похоже, мой код (или сервер) автоматически экранирует одинарные кавычки. Это новый стандарт или на моем сервере активирована настройка, о которой я не знаю? Есть ли необходимость в очистке ввода?

Вот пример моего серверного кода:

$foo = $_POST['foo'];
$sql = "SELECT * FROM bar WHERE foo='" . $foo . "'";

connectoTo("database");
query($sql);

Где connectTo () подключается к серверу базы данных и выбирает базу данных, а query () - это обычная процедура, используемая при выполнении запроса. Нет очистки, что так всегда. Тем не менее, когда я отправляю

$_POST['foo'] = "' OR 1=1 #" 

страница PHP получает это как

$_POST['foo'] = "\' OR 1=1 #"

Так foo уже сбежал? То же самое с $ _GET.

Есть мысли? Разве нам больше не нужно очищать пользовательский ввод?

Ответы [ 2 ]

8 голосов
/ 15 июня 2011

В PHP есть «мертвая» функция, которая автоматически экранирует данные POST / GET и называется Магические кавычки .Идея состояла в том, чтобы не допустить возникновения распространенных типов SQL-инъекций.

В действительности вы получаете перемешанные данные, и SQL-инъекция все еще была очень возможной, в зависимости от реализации.Разработчики PHP быстро поняли это, устарели и отказались от его использования.

При правильной установке PHP это должно быть абсолютно отключено!Если у вас нет доступа к PHP.ini для установки magic_quotes_gpc off, то вы можете поместить это в верхнюю часть своего кода:

if (get_magic_quotes_gpc()) {
    $process = array(&$_GET, &$_POST, &$_COOKIE, &$_REQUEST);
    while (list($key, $val) = each($process)) {
        foreach ($val as $k => $v) {
            unset($process[$key][$k]);
            if (is_array($v)) {
                $process[$key][stripslashes($k)] = $v;
                $process[] = &$process[$key][stripslashes($k)];
            } else {
                $process[$key][stripslashes($k)] = stripslashes($v);
            }
        }
    }
    unset($process);
}

Взят от: http://www.php.net/manual/en/security.magicquotes.disabling.php

Сейчас, к вашей проблеме внедрения SQL.Видите ли, есть куда больше поводов для беспокойства, чем просто цитаты.Вы не указываете, какую базу данных вы используете, но это не имеет значения.Лучший способ избежать проблем с внедрением - использование подготовленных / параметризованных запросов.

Подготовленные запросы - это запросы, отправляемые на сервер с параметрами, значения которых отправляются позже.

INSERT INTO someTable (field1, field2) VALUES (:field1, :field2);

Обратите внимание на :field1 и :field2, так как они являются параметрами.Когда я выполню это утверждение, они будут заменены правильными значениями.Поскольку сервер это делает, экранирование не требуется (и / или это происходит в фоновом режиме, в зависимости от используемого вами уровня БД).

Самый простой способ реализовать это в PHP - использоватьPDO.Как использовать PDO слишком долго для этой коробки, поэтому я укажу вам направление обучения:

http://net.tutsplus.com/tutorials/php/why-you-should-be-using-phps-pdo-for-database-access/

6 голосов
/ 15 июня 2011

Отключить magic_quote в php.ini и использовать PDO.

...