阅读涉及安全性的响应后,django提供了sql注入。我想知道“底层驱动程序转义sql”是什么意思。 出于缺乏更好的说法,这是否意味着“数据库驱动程序”会检查视图/ 查询集所在的位置是否具有查询特征,并拒绝某些查询的“特征”?
我了解这是一种“低级”讨论,但我不了解潜在的机制如何阻止此攻击,并希望对此处发生的情况进行任何简化的解释。
答案 0 :(得分:1)
确切地说,我们在这里处理参数转义。
django本身不会转义参数值。它使用的驱动程序API通常看起来与此类似(例如,参见postgres或mysql的驱动程序):
driver.executeQuery(
'select field1 from table_a where field2 = %(field2)s', {'field2': 'some value'}
)
这里要注意的重要一点是,参数值(可能由用户提供,并且需要进行sql注入)未嵌入查询本身。该查询将通过占位符传递给驱动程序以获取参数值,并另外传递参数列表或dict。
然后,驱动程序可以使用适当的转义参数值构造SQL查询,也可以使用数据库本身提供的功能相似的API(即它使用占位符和参数值进行查询)。
Django查询集使用这种方法来生成SQL,以及本文档试图说的话。