Действительно ли многострочное внедрение SQL запросов безопасно?

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

У меня есть запрос, который похож на это:

<?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'

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

5
задан acm 1 June 2010 в 17:34
поделиться

4 ответа

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

5
ответ дан 18 December 2019 в 11:54
поделиться
$something = "'; DROP TABLE table_x; SELECT * FROM table_z WHERE '1' = '1";
5
ответ дан 18 December 2019 в 11:54
поделиться

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

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

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

2
ответ дан 18 December 2019 в 11:54
поделиться

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

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

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

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

3
ответ дан 18 December 2019 в 11:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: