我在这里的某个地方读到,在PDO中使用预准备语句使您的应用程序只对一阶SQL注入免疫,但不能完全免疫二阶注入。
我的问题是:如果我们在包括SELECT查询在内的所有查询中都使用了预准备语句,而不仅仅是在INSERT查询中,那么二阶sql注入怎么可能呢?
例如,在以下查询中,没有机会进行二次注入:
写入:
INSERT INTO posts (userID,text,date) VALUES(?,?,?)阅读:
SELECT * FROM posts WEHRE userID=?删除:
DELETE FROM posts WHERE userID=?发布于 2014-03-29 12:00:37
你所读到的简直是垃圾。写这篇文章的人根本没有头绪。
不应将预准备语句用于查询,而应将其用于数据。每次你必须在查询中添加一个变量时,你只能通过占位符来实现。因此,您的查询分离理论毫无意义:不管它是SELECT、ALTER、GRANT还是其他什么。唯一重要的是--是否有任何变量进入查询。
发布于 2014-03-29 17:07:01
由于大多数人鼓吹“用户是邪恶的”和“不要相信用户的输入”,人们可能会得到这样的印象:一旦数据进入数据库,它就是“可信的”。
但是SQL注入与可信和不可信的数据无关。SQL injection is the failure of ensuring that an SQL statement is interpreted as intended.
这就是准备好的语句/参数化发挥作用的地方,因为它是一种确保参数被解释为预期的技术,即作为数据而不是SQL代码。这应该应用于任何数据,无论其来源如何,也不管它是“可信的”还是“不可信的”,只是为了确保数据被解释为预期的。
https://stackoverflow.com/questions/22724818
复制相似问题