SQLAlchemy + SQL Injection

Каковы наилучшие методы смягчения SQL-инъекций при использовании SQLAlchemy?

3 Solutions collect form web for “SQLAlchemy + SQL Injection”

Если у вас есть какие-либо «специальные» символы (такие как точки с запятой или апострофы) в ваших данных, они будут автоматически указаны для вас объектом SQLEngine, поэтому вам не нужно беспокоиться о цитировании. Это также означает, что, если вы не намеренно обходите механизмы цитирования SQLAlchemy, атаки SQL-инъекций в принципе невозможны.

[на http://www.rmunn.com/sqlalchemy-tutorial/tutorial.html ]

tldr: Избегайте необработанного SQL как можно больше.

Принятый ответ ленив и неверен. Метод фильтра принимает необработанный SQL, и если он используется таким образом, он полностью восприимчив к атакам SQL-инъекций. Например, если вы должны принять значение из URL-адреса и объединить его с сырым sql в фильтре, вы можете атаковать:

session.query(MyClass).filter("foo={}".format(getArgs['val']))

используя приведенный выше код и приведенный ниже URL, вы будете вводить SQL в свой оператор фильтра. Приведенный выше код вернет все строки в вашей базе данных.

http://domain.com/?val=2%20or%201%20=%201

Чтобы добавить к ответу @Tendrid . Я сделал небольшое исследование, используя тихий наивный подход. метод filter имеет *criterion качестве аргумента, несколько других методов запроса ORM имеют аналогичный аргумент.

В случае, когда аргумент *criterion filter *criterion заканчивается передачей в _literal_as_text , который в случае строки указывает на его безопасный sql (пожалуйста, исправьте меня, если я ошибаюсь). Поэтому он делает его небезопасным.

Вот результат исследования метода класса ORM Query с аргументом *criterion :

 filter - uses _literal_as_text (NOT SAFE) having - uses _literal_as_text (NOT SAFE) distinct - uses _literal_as_label_reference (NOT SAFE) group_by - uses _literal_as_label_reference (NOT SAFE) order_by - uses _literal_as_label_reference (NOT SAFE) join - uses model attributes to resolve relation (SAFE) 

Примеры возможных меток метода (чтобы их было просто, форматирование строк пропущено):

 db.session.query(User.login).group_by('login').having('count(id) > 4; select name from roles').all() db.session.query(User.login).distinct('name) name from roles /*').order_by('*/').all() db.session.query(User.login).order_by('users_login; select name from roles').all() db.session.query(User.login).group_by('login union select name from roles').all() 
  • Python / SQL Alchemy Migrate - «ValueError: слишком много значений для распаковки» при переносе изменений в db
  • Быстрое сброс базы данных в память в файл
  • Автозаполнение PyCharm SQLAlchemy
  • SQLAlchemy - Как сделать «выбор django» с помощью SQLAlchemy?
  • PickleType с контролируемым отслеживанием в SqlAlchemy
  • удалять взаимно-однозначные отношения в колбе
  • Соединение UniqueConstraint с функцией
  • SQLAlchemy: отображение нескольких таблиц и отношений
  • Python - лучший язык программирования в мире.