准备语句和二阶SQL注入

时间:2014-03-28 23:19:29

标签: php mysql prepared-statement sql-injection

我在这里读过,在PDO中使用预处理语句会使您的应用程序仅对一阶SQL注入免疫,但不能完全免于二阶注入。

我的问题是:如果我们在所有查询中使用预准备语句包含SELECT查询而不仅仅是在INSERT查询中,那么如何才能进行二阶sql注入?

例如,在以下查询中,没有机会进行二阶注入:

写:

INSERT INTO posts (userID,text,date) VALUES(?,?,?)

读:

SELECT * FROM posts WEHRE userID=?

删除:

DELETE FROM posts WHERE userID=?

2 个答案:

答案 0 :(得分:2)

你所读到的只是一种简单的垃圾。写这篇文章的人不知道。

您应该使用不是查询而是数据的预准备语句。每次必须在查询中添加变量时,都必须通过占位符来创建。所以,你的查询分离理论是没有意义的:如果它选择SELECT或ALTER或GRANT或其他什么并不重要。唯一重要的是 - 如果有任何变量进入查询或不进行查询。

答案 1 :(得分:1)

由于大多数人讲道“用户是邪恶的”和“不信任用户输入”,人们可能会觉得,一旦数据在数据库中,它就会被“信任”。

但SQL注入与可信和不受信任的数据无关。 SQL injection is the failure of ensuring that an SQL statement is interpreted as intended.

这就是预备语句/参数化发挥作用的地方,因为它是一种确保参数被解释为预期的技术,即。例如,作为数据而不是SQL代码。这应该应用于任何数据,无论其来源或是否被视为“可信”或“不可信”,只是为了确保数据被解释为预期。