SQLAlchemy + SQL-инъекция - PullRequest
       11

SQLAlchemy + SQL-инъекция

39 голосов
/ 28 июня 2011

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

Ответы [ 3 ]

61 голосов
/ 14 апреля 2013

tldr: максимально избегайте необработанного SQL.

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

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

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

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

42 голосов
/ 28 июня 2011

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

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

5 голосов
/ 01 июня 2016

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

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

Вот результат исследования класса ORM исследования метода с аргументом *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()

Обратите внимание , что эти методы небезопасны только при передаче строкового литерала.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...