多行查询是否安全?

时间:2010-06-01 17:34:46

标签: php sql-injection multilinestring

这可能是一个愚蠢的问题。 或许我的黑客技能有限(我根本不练习)。

我有一个如下所示的查询:

<?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);(后来会产生一个字符串),它们都没有打算防止注入,但它们使得它很难注入以获取实际查询。 但是,有办法。我们都知道为一个仍然有效的其他东西替换空间是多么容易..

因此,使$something的SQL可能有害的部分达到真正的问题... 但是,如果它是多行的话,有没有办法对原始查询字符串的其余部分进行注释?

我可以使用AND table_z.field4 = '1';--发表评论,但无法评论以下AND table_z.field5 = '2'

是否可以打开多行注释/*而不关闭它或看起来像什么,因此允许注入忽略多行查询?

4 个答案:

答案 0 :(得分:5)

这不安全。即使它不能注释掉其余部分,它也可以用SELECT * FROM my_table WHERE 1 = 1作为前缀。

答案 1 :(得分:5)

$something = "'; DROP TABLE table_x; SELECT * FROM table_z WHERE '1' = '1";

答案 2 :(得分:3)

使用预先准备好的陈述是安全的:

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

如果输入没有充分清理,字符串插值总是存在代码注入的风险。

删除执行任意代码的可能性是更容易和更安全的方式。

答案 3 :(得分:2)

@Techpriester:这不是准备好的陈述。

http://dev.mysql.com/tech-resources/articles/4.1/prepared-statements.html(旧版本,同样的事情)

PDO是一个“准备语句”的数据库抽象层,但准备好的语句完全不同!