django如何使用查询集“转义” sql注入?

时间:2019-11-29 03:26:36

标签: django django-queryset sql-injection

阅读涉及安全性的响应后,django提供了sql注入。我想知道“底层驱动程序转义sql”是什么意思。 出于缺乏更好的说法,这是否意味着“数据库驱动程序”会检查视图/ 查询集所在的位置是否具有查询特征,并拒绝某些查询的“特征”?

我了解这是一种“低级”讨论,但我不了解潜在的机制如何阻止此攻击,并希望对此处发生的情况进行任何简化的解释。

Link to docs

enter image description here

1 个答案:

答案 0 :(得分:1)

确切地说,我们在这里处理参数转义。

django本身不会转义参数值。它使用的驱动程序API通常看起来与此类似(例如,参见postgresmysql的驱动程序):

driver.executeQuery(
  'select field1 from table_a where field2 = %(field2)s', {'field2': 'some value'}
)

这里要注意的重要一点是,参数值(可能由用户提供,并且需要进行sql注入)未嵌入查询本身。该查询将通过占位符传递给驱动程序以获取参数值,并另外传递参数列表或dict。

然后,

驱动程序可以使用适当的转义参数值构造SQL查询,也可以使用数据库本身提供的功能相似的API(即它使用占位符和参数值进行查询)。

Django查询集使用这种方法来生成SQL,以及本文档试图说的话。