Pandas 中的 SQL 注入;将列表绑定到 SQLAlchemy 中的参数

tan*_*ius 4 python sqlalchemy pandas

我有这个 SQL 查询:

sql = "select * from table where date in {dl}"
Run Code Online (Sandbox Code Playgroud)

其中 dl 是日期元组。我可以string.format(dl=...)通过read_sql_query在 Pandas 中使用 then 来执行查询,但我读到这可能会导致 SQL 注入,因此不安全。

但是,SQLAlchemy 中似乎没有一个好的替代方案。您似乎无法使用 将列表传递给参数text(),并且首先将列表转换为字符串会导致错误。我看到你可以遍历列表并一个一个地传递参数,但是为什么有人想要这样做呢?

清理变量(删除引号、分号等)是否有助于降低 SQL 注入的风险?无法使用原始 SQL 字符串听起来很糟糕。

uni*_*rio 6

您可以使用.bindparams()将参数绑定到text()构造中的值:

sql = text("select * from table where date in :dl").bindparams(dl=...)
Run Code Online (Sandbox Code Playgroud)

请注意,您传递给的值dl必须是要正确呈现的元组。