Как предотвратить внедрение SQL в предложении LIKE '% input%'? - PullRequest
0 голосов
/ 24 мая 2018

Я использую SQLAlchemy с PostgreSQL, и мне нужно сгенерировать оператор типа

SELECT * FROM entities WHERE name LIKE '%input%';

, где «входной» бит строки LIKE поступает от пользователя.Я хотел бы, чтобы пользователь мог включать буквальные символы % и _ и точно совпадать с ними, и, очевидно, мне нужно убедиться, что запрос не допускает SQL-инъекцию.Какой идиоматический способ сделать это в SQLAlchemy?Я попытался

entities = session.query(Entity).filter(Entity.name.like('%:text%')) \
               .params(text=user_input).all()

, но, похоже, это не сработало - оно выполнялось без жалоб, но не совпадало со строками, которые должны были совпадать.

1 Ответ

0 голосов
/ 24 мая 2018

Использовать contains() и autoescape=True:

Entity.name.contains(user_input, autoescape=True)

Учитывая autoescape=True SQLAlchemy установит escape-символ и escape-вхождения "%""_" и сам символ выхода.Вы можете управлять escape-символом явно, используя параметр escape=.

...