Django Q 对象(复杂查询)是不是安全?

Posted

技术标签:

【中文标题】Django Q 对象(复杂查询)是不是安全?【英文标题】:Are Django Q objects (complex queries) secure?Django Q 对象(复杂查询)是否安全? 【发布时间】:2015-01-22 20:36:26 【问题描述】:

我似乎找不到任何资源来解释 Django 内置复杂查询(Q 对象或 F 对象)的安全性。是否可以在这些查询中注入 SQL 攻击?我做了一个小测试:

from models import *
from django.db.models import Q
q = MyModel.objects.filter(Q(mycolumn__contains='%; DROP DATABASE mydatabase;'))
print q
>>> []
print q.query
>>> SELECT `mydatabase_mytable`.`mycolumn` FROM `mydatabase_mytable` WHERE 
    `mydatabase_mytable`.`mycolumn` LIKE BINARY %\%; DROP DATABASE mydatabase;% 

这似乎并没有删除我的数据库。这是怎么回事?

【问题讨论】:

【参考方案1】:

从 SQL 中可以看出,Django 正在转义 LIKE 子句。 Here 是对在这种情况下发生的事情的引用。

一般来说,Django 确实可以保护您免受 SQL 注入攻击。 Here 是他们的安全页面。请注意,执行自定义 SQL 或不小心使用“extra”可能会遇到麻烦,否则,您会受到保护。

【讨论】:

使用extra(),或者直接使用带有原始SQL的底层连接/游标。

以上是关于Django Q 对象(复杂查询)是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

在 Django 中使用 Q() 动态构建复杂查询 [关闭]

Django篇之F,Q

Django get_next_by_FIELD 使用复杂的 Q 查找

Django Q AND 查找 - 在复杂查找中查询多个条目

使用 filter() 和 Q 对象混合的 Django ORM 查询

在 Django 中构造 Q 对象时保持 SQL 运算符优先级