Безопасны ли многострочные запросы sql-injection?

Это может быть глупый вопрос. Или, может быть, мои хакерские навыки ограничены (я их вообще не практикую).

У меня есть запрос, который выглядит так:

<?php
$query =<<<eot
    SELECT      table_x.field1,
                table_x.field2,
                table_y.*,
                table_z.field4
    FROM        (
                    SELECT ...
                ) as table_y
    LEFT JOIN   table_x
    ON          table_x.field1 = table_y.field_x
    LEFT JOIN   table_z
    ON          table_z.field1 = table_y.field_z
    WHERE       table_x.field3 = '$something'
    AND         table_z.field4 = '1'
    AND         table_z.field5 = '2'
eot;
?>

У меня есть много других тестов на $something, прежде чем он будет использован, например $something = explode(' ',$something); (который позже приводит к строке), ни один из них не предназначен для предотвращения инъекции, но они затрудняют получение данной инъекции как есть для фактического запроса. Однако есть способы. Все мы знаем, как легко заменить пробел чем-то другим, что все еще актуально.

Таким образом, на самом деле не проблема заставить потенциально опасную часть SQL достичь этого $something... Но есть ли способ прокомментировать остальную часть исходной строки запроса, если она многострочная?

Я могу прокомментировать AND table_z.field4 = '1' с помощью ;--, но не могу прокомментировать следующее AND table_z.field5 = '2'

Можно ли открыть многострочный комментарий /*, не закрывая его или что-то похожее, и, следовательно, позволить инъекции игнорировать многострочный запрос?


person acm    schedule 01.06.2010    source источник


Ответы (3)


Это небезопасно. Даже если он не может закомментировать остальное, он может добавить префикс SELECT * FROM my_table WHERE 1=1.

person Adam Crume    schedule 01.06.2010
comment
Спасибо, Адам, ты прав. Этот многострочный запрос легко взломать. Позор мне, что я не увидел этот вариант. Однако это пример, и моя ситуация немного сложнее. Поскольку мне не удалось объясниться, я приму ваш ответ как правильный. - person acm; 01.06.2010

Используйте подготовленные операторы, чтобы быть в безопасности:

http://www.php.net/manual/en/pdo.prepare.php

Интерполяция строк всегда сопряжена с риском внедрения кода, если ваш ввод недостаточно очищен.

Удаление возможности выполнения произвольного кода является более простым и безопасным способом.

person selfawaresoup    schedule 01.06.2010
comment
+1 Это действительно единственный правильный ответ. Очистка себя зависит от ваших знаний о SQL-инъекциях. Позвольте базе данных/протестированному ORM справиться с этим за вас. - person richsage; 01.06.2010

@Techpriester: это не то, чем является подготовленное заявление.

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html (старая версия, то же самое)

PDO — это уровень абстракции базы данных, который «подготавливает операторы», но подготовленный оператор — это нечто совершенно другое!

person Entendu    schedule 01.06.2010
comment
PDO по умолчанию эмулирует подготовленные операторы, но вы можете отключить этот режим $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); Посмотрите свой общий журнал запросов MySQL и убедитесь, что он работает! - person Bill Karwin; 01.06.2010