django 'escape' sql 究竟如何注入查询集?
How exactly does django 'escape' sql injections with querysets?
阅读涉及安全的响应后,django 提供了 sql 注入。我想知道文档中的 'the underlying driver escapes the sql' 是什么意思。
这是否意味着,由于缺少更好的词,'database driver' 检查 view/wherever queryset 是否定位查询的特征,并拒绝 'characteristics' 某些查询?
我知道这是一种 'low-level' 讨论,但我不明白底层机制是如何防止这种攻击的,感谢对这里发生的事情的任何简化解释。
准确地说,我们在这里处理的是参数转义。
django 本身不会转义参数值。它使用的驱动程序的 API 通常看起来与此类似(例如,请参见 postgres or mysql 的驱动程序):
driver.executeQuery(
'select field1 from table_a where field2 = %(field2)s', {'field2': 'some value'}
)
这里要注意的重要一点是,参数值(可能由用户提供并受到 sql 注入)没有嵌入到查询本身。查询通过参数值的占位符传递给驱动程序,除此之外还传递参数列表或字典。
驱动程序然后可以使用适当的参数转义值构造 SQL 查询,或者使用数据库本身提供的 API ,这在功能上是相似的(即它使用占位符和参数值)。
Django 查询集使用这种方法生成 SQL 以及这篇文档试图表达的内容。
阅读涉及安全的响应后,django 提供了 sql 注入。我想知道文档中的 'the underlying driver escapes the sql' 是什么意思。 这是否意味着,由于缺少更好的词,'database driver' 检查 view/wherever queryset 是否定位查询的特征,并拒绝 'characteristics' 某些查询?
我知道这是一种 'low-level' 讨论,但我不明白底层机制是如何防止这种攻击的,感谢对这里发生的事情的任何简化解释。
准确地说,我们在这里处理的是参数转义。
django 本身不会转义参数值。它使用的驱动程序的 API 通常看起来与此类似(例如,请参见 postgres or mysql 的驱动程序):
driver.executeQuery(
'select field1 from table_a where field2 = %(field2)s', {'field2': 'some value'}
)
这里要注意的重要一点是,参数值(可能由用户提供并受到 sql 注入)没有嵌入到查询本身。查询通过参数值的占位符传递给驱动程序,除此之外还传递参数列表或字典。
驱动程序然后可以使用适当的参数转义值构造 SQL 查询,或者使用数据库本身提供的 API ,这在功能上是相似的(即它使用占位符和参数值)。
Django 查询集使用这种方法生成 SQL 以及这篇文档试图表达的内容。