Как избежать атак SQL Injection в ваших Django Rest API при использовании родного ORM?

Они говорят, что при использовании Django ORM вы уже защищены от большинства атак SQL Injection. Однако я хотел бы узнать, есть ли какие-либо дополнительные меры, которые должны или могут быть использованы для обработки пользовательского ввода? Какие-нибудь библиотеки вроде bleach?

Главная опасность использования Django ORM заключается в том, что вы можете дать пользователям мощный инструмент для выбора, фильтрации и агрегации по произвольным полям.

Действительно, допустим, например, вы делаете форму, которая позволяет пользователям выбирать поля для возврата, тогда вы можете реализовать это как:

data = MyModel.objects.values(*request.GET.getlist('fields'))

Если MyModel имеет ForeignKey к модели пользователя с именем owner, то пользователь может подделать запрос с owner__password в качестве поля и таким образом получить ( хэшированные) пароли. Хотя Django хранит для своей модели по умолчанию User хэшированный пароль, это все равно означает, что хэшированные данные открыты, и это может облегчить получение паролей.

Но даже если нет модели пользователя, это может привести к тому, что пользователи могут подделывать запросы, в которых они используют ссылки на конфиденциальные данные, и таким образом могут получить большое количество конфиденциальных данных. То же самое может произойти при произвольной фильтрации, аннотировании, агрегировании и т.д.

Таким образом, вы должны вести список допустимых значений и проверять, что запрос содержит только эти значения, например:

acceptable = {'title', 'description', 'created_at'}
data = [field for field in request.GET.getlist('fields') if field in acceptable]
data = MyModel.objects.values(*data)

Если вы, например, используете пакеты типа django-filter [readthedocs.io], вы перечисляете поля, которые можно фильтровать, и какие поиски могут быть сделаны для этих полей. Остальные данные в request.GET будут игнорироваться, что предотвратит фильтрацию с произвольными полями.

Вернуться на верх