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

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

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

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

有帮助吗?

解决方案

这不安全。即使其余的也无法评论,它也可以将其与select *从my_table中进行前缀1 = 1。

其他提示

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

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

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

如果您的输入未充分清洁,则字符串插值始终具有代码注入的风险。

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

@TechPriester:那不是准备好的陈述。

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top