如何防止在 LIKE '%input%' 子句中注入 SQL?

How do I prevent SQL injection in a LIKE '%input%' clause?

我正在使用 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()

但这似乎没有用——它没有抱怨地执行但没有匹配应该匹配的行。

使用contains() and autoescape=True:

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

给定 autoescape=True SQLAlchemy 将建立转义字符并转义出现的 "%""_" 和转义字符本身。您可以使用 escape= 参数显式控制转义字符。