准备好的语句和二阶SQL注入

我在这里读过的一些地方是,在PDO中使用准备好的语句使得你的应用程序仅仅能够免疫一阶SQL注入,但并不完全免疫二次注入。

我的问题是:如果我们在包含SELECT查询的所有查询中使用准备好的语句,而不仅仅是在INSERT查询中使用准备好的语句,那么如何执行二次SQL注入成为可能?

例如在下面的查询中,没有机会进行二次订单注入:

写:

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

读:

SELECT * FROM posts WEHRE userID=?

删除:

DELETE FROM posts WHERE userID=?

你读到的是一个普通的垃圾。 有人写这篇文章只是没有线索。

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


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

但是SQL注入与可信和不可信数据无关。 SQL注入是确保SQL语句按照预期解释的失败。

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

链接地址: http://www.djcxy.com/p/93781.html

上一篇: Prepared statements and second order SQL injections

下一篇: PDO MySQL: Use PDO::ATTR