Метод Django full_clean и безопасность данных

#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