#django #django-models
#django #django-модели
Вопрос:
Мне нужно взять необработанные данные JSON и поместить их непосредственно в модель Django с помощью метода Mymodel.objects.create( …). Если я затем запускаю full_clean() в созданном экземпляре, является ли он безопасным с точки зрения потенциальной SQL-инъекции или любых вредоносных данных, которые потенциально могут быть введены?
Причина, по которой я не использую форму, заключается в том, что логика формы довольно сложна в том, что она динамически создает форму, поэтому мне нужно отправлять данные в формате json. Я не хочу использовать rest api, поскольку есть только одна страница, где она имеет такую сложность.
Комментарии:
1. Обычно ORM Django защищен от SQL-инъекций, но перед этим вам необходимо выполнить полную очистку, поскольку Django ORM не запускает
full_clean
, и это проверяет целостность данных.2. Большое спасибо, похоже, все должно быть хорошо. Просто нужно было уточнить, поскольку я не был уверен, нужно ли запускать данные через формы, чтобы они были безопасными.
3. небезопасно в том смысле, что он выполняет SQL-инъекцию нет, но это не означает, что данные действительны. Представьте, что человек каким-то образом делает запрос POST таким образом, что ему «нравится», например, объект, который ему запрещено видеть, используя его идентификатор, затем позже он может увидеть сообщение, потому что ему удалось ввести запись, в которой ему понравился этот объект. Внедрение SQL — это не единственная угроза безопасности.
Ответ №1:
.full_clean(…)
[Django-doc] не выполняет никаких проверок SQL-инъекции, как и Django ORM, поскольку он просто экранирует все параметры, поэтому, даже если данные содержат операторы SQL, они экранируются, и поэтому, как правило, SQL-инъекция невозможна.
Но вам нужно выполнить full_clean
проверку целостности данных. Если вы определяете ограничения для своей модели, они обычно проверяются в full_clean
части. ORM не выполняет эти запросы.
Таким образом, вы можете работать с:
obj = Mymodel(**data)
obj.full_clean()
obj.save()
Причина, по которой я не использую форму, заключается в том, что логика формы довольно сложна в том, что она динамически создает форму.
Форма может удалить много шаблонного кода, поскольку она выполняет не только проверку, но и очистку, делает сообщения об ошибках более удобными и т. Д.
Ответ №2:
Django ORM защищает базу данных от SQL-инъекций, но вы несете ответственность за результат. Для удобной очистки данных я рекомендую использовать сериализаторы DRF