Безопасны ли многострочные запросы sql-инъекций? - PullRequest
5 голосов
/ 01 июня 2010

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

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

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

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

Ответы [ 4 ]

5 голосов
/ 01 июня 2010
$something = "'; DROP TABLE table_x; SELECT * FROM table_z WHERE '1' = '1";
5 голосов
/ 01 июня 2010

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

3 голосов
/ 01 июня 2010

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

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

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

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

2 голосов
/ 01 июня 2010

@ Techpriester: это не то, что готовое утверждение.

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

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

...