Как избежать атак 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
будут игнорироваться, что предотвратит фильтрацию с произвольными полями.