我在这里读过,在PDO中使用预处理语句会使您的应用程序仅对一阶SQL注入免疫,但不能完全免于二阶注入。
我的问题是:如果我们在所有查询中使用预准备语句包含SELECT查询而不仅仅是在INSERT查询中,那么如何才能进行二阶sql注入?
例如,在以下查询中,没有机会进行二阶注入:
写:
INSERT INTO posts (userID,text,date) VALUES(?,?,?)
读:
SELECT * FROM posts WEHRE userID=?
删除:
DELETE FROM posts WHERE userID=?
答案 0 :(得分:2)
你所读到的只是一种简单的垃圾。写这篇文章的人不知道。
您应该使用不是查询而是数据的预准备语句。每次必须在查询中添加变量时,都必须通过占位符来创建。所以,你的查询分离理论是没有意义的:如果它选择SELECT或ALTER或GRANT或其他什么并不重要。唯一重要的是 - 如果有任何变量进入查询或不进行查询。
答案 1 :(得分:1)
由于大多数人讲道“用户是邪恶的”和“不信任用户输入”,人们可能会觉得,一旦数据在数据库中,它就会被“信任”。
但SQL注入与可信和不受信任的数据无关。 SQL injection is the failure of ensuring that an SQL statement is interpreted as intended.
这就是预备语句/参数化发挥作用的地方,因为它是一种确保参数被解释为预期的技术,即。例如,作为数据而不是SQL代码。这应该应用于任何数据,无论其来源或是否被视为“可信”或“不可信”,只是为了确保数据被解释为预期。