python - SQLAlchemy 文本函数是否暴露于 SQL 注入(inject)?

标签 python python-3.x sqlalchemy

我正在学习如何使用 SQL Alchemy,并且正在尝试重新实现以前定义的 API,但现在使用的是 Python。

REST API 具有以下查询参数:

myService/v1/data?range=time:2015-08-01:2015-08-02

所以我想映射类似 field:FROM:TO 的内容来过滤一系列结果,例如日期范围。

这就是我现在正在使用的:

 rangeStatement = range.split(':')
                if(len(rangeStatement)==3):
                    query = query.filter(text('{} BETWEEN "{}" AND "{}"'.format(*rangeStatement)))

因此,这将产生以下 WHERE 条件:

WHERE time BETWEEN "2015-08-01" AND "2015-08-02"

我知道 SQL Alchemy 是一个强大的工具,它允许创建类似 Query.filter_by(MyClass.temp) 的查询,但我需要 API 请求尽可能开放。

所以,我担心有人可以在 range 参数中传递类似 DROP TABLE 的内容并利用 text 函数

最佳答案

如果查询是使用字符串格式构建的,那么 sqlalchemy.text 将不会阻止 SQL 注入(inject)——“注入(inject)”将已经存在于查询文本中。然而,动态构建查询并不困难,在本例中使用 getattr获取对该列的引用。假设您正在使用带有模型类 Foo 和表 foos 的 ORM 层,您可以这样做

import sqlalchemy as sa
...
col, lower, upper = 'time:2015-08-01:2015-08-02'.split(':')

# Regardless of style, queries implement a fluent interface,
# so they can be built iteratively

# Classic/1.x style
q1 = session.query(Foo)
q1 = q1.filter(getattr(Foo, col).between(lower, upper))
print(q1)

# 2.0 style (available in v1.4+)
q2 = sa.select(Foo)
q2 = q2.where(getattr(Foo, col).between(lower, upper))
print(q2)

各自的输出是(参数会在执行时绑定(bind)):

SELECT foos.id AS foos_id, foos.time AS foos_time 
FROM foos 
WHERE foos.time BETWEEN ? AND ?

SELECT foos.id, foos.time 
FROM foos 
WHERE foos.time BETWEEN :time_1 AND :time_2

SQLAlchemy 会将值的引用委托(delegate)给引擎正在使用的连接器包,因此您可以像连接器包* 提供的一样好地防止注入(inject)。


* 一般来说,我认为正确的引用应该可以很好地防御 SQL 注入(inject),但我还不够专业,无法自信地说它 100% 有效。不过,它比从字符串构建查询更有效。

关于python - SQLAlchemy 文本函数是否暴露于 SQL 注入(inject)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69276393/

相关文章:

python - 斐波那契数列的 Python 代码效率如何?

python - 计算 Pandas 分组对象中的唯一值

python-3.x - 我的 Selenium Webdriver 脚本返回一个我不明白的错误

python - 使用 sqlalchemy 从 mysql 获取大量数据的最佳方法是什么?

python - Pycharm 中没有模块 pygame

python - 将有限的记录分组,其余的分组为其他

python - 从 python 中的两个列表创建 Pandas df

python - If、Elif、大于、小于逻辑

python - Flask SQLAlchemy - 如果提供的过滤器没有结果,则默认过滤器值

python - 何时使用 SQLAlchemy 以及何时使用 Pandas 进行数据操作