参数化查询的缺点是克服SQL注入?

时间:2014-06-19 07:26:41

标签: database sql-injection

SQLInjection攻击在“参数化查询”中使用参数替换外部值。但我不知道它带来的缺点。如果有的话那将是一个很大的帮助。 :)

2 个答案:

答案 0 :(得分:0)

应用我们所知的所有技术来防止注射总是一个好主意。 派生化查询的“优点”主要是避免“OR 1 = 1”和其他常见的SQL注入:强制数据库将绑定变量中的所有内容解释为数据而不是SQL指令。因此,如果我有不好的意图,就会很难放下你的一张桌子。

参数化SQL的“缺点”主要与你没有习惯的灵活性有关(你不能同时进行两个查询,有两个while循环,第二个使用或例如,在MySQLi中尝试使用第一次调用获得的参数而不进行一些调整。切换时可能遇到的问题示例如Nested looping with mysqli and fetch_object或陈述here)。这不是避免转换到更安全的编程的好理由,我认为它也可以防止一些人可能通过所谓的“香草编程”获得的坏习惯(就我而言,我已经获得了一些),但是,回答这个问题的另一个人指出,也有解决方法。我不知道其他的缺点,也许是因为没有。

您还可以参考有关SO的相关问题,例如Are Parameters really enough to prevent Sql injections?等等。我不确定这不是重复,但我回答所有相同的事情以试图消除你的疑虑。

答案 1 :(得分:0)

我看到的一个缺点是使查询更难以阅读和修改。幸运的是,有解决方法,所以而不是写

"SELECT foo + ? FROM bar WHERE x = ? AND y = ? AND z IN (?, ?)", offset, x, y, z1, z2
在Scala Slick中你可以写

sql"SELECT foo + $offset FROM bar WHERE x = $x AND y = $y AND z IN ($z1, $z2)"

和MySQL ++

query << "SELECT foo + " << quote << offset << " FROM bar WHERE x = " << quote << x << " AND y = " << quote << y << " AND z IN (" << quote << z1 << ", " << quote << z2 << ")"