5

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

我有一个看起来像这样的查询:

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

4 回答 4

5

这不安全。即使它不能注释掉其余部分,它也可以在它前面加上 SELECT * FROM my_table WHERE 1=1。

于 2010-06-01T17:37:02.107 回答
5
$something = "'; DROP TABLE table_x; SELECT * FROM table_z WHERE '1' = '1";
于 2010-06-01T17:37:44.847 回答
3

使用准备好的语句是安全的:

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

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

消除执行任意代码的可能性是更容易且更安全的方法。

于 2010-06-01T17:45:37.030 回答
2

@Techpriester:这不是准备好的声明。

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

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

于 2010-06-01T19:41:31.287 回答