Защищены ли объекты Django Q (сложные запросы)?
Кажется, я не могу найти никаких ресурсов, объясняющих безопасность встроенных в 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. Вот ссылка на то, что происходит в этом случае.
В общем, Django защищает вас от атак SQL-инъекций. Вот их страница безопасности. Обратите внимание, что вы можете столкнуться с проблемами, выполняя пользовательский SQL или небрежно используя "extra", но в противном случае вы защищены.