提问人:Zev Isert 提问时间:8/13/2022 最后编辑:Zev Isert 更新时间:8/14/2022 访问量:331
使用 SQLAlchemy 通过用户输入安全地创建实例化视图
Safely creating materialized views with user input using SQLAlchemy
问:
我正在尝试在Postgres(使用TimescaleDB)中创建物化视图,用户可以在其中控制所选字段之一。我知道物化视图不能参数化为准备好的语句,因为需要保存这些参数以备以后更新视图时使用(感谢这个答案)。
我正在寻找一种方法来说服自己,在尝试做这样的事情时,我的代码是安全的:
from sqlalchemy import text
from databases import Database
db = Database('postgres+asyncpg://localhost')
await db.connect()
path = '{some_key,nested_key}' # User controlled string
await db.execute(text(
'''
CREATE MATERIALIZED VIEW test_view WITH (timescaledb.continuous) AS
SELECT
time_bucket(interval '5 minutes', timestamp) AS bucket,
avg(:variable_part)
FROM metrics
GROUP BY bucket
WITH NO DATA;
''')
.bindparams(variable_part=f"results#>>'{path}'") # JSONB path selection
)
当然这个例子不起作用,我的驱动程序(asyncpg)正确报告。FeatureNotSupportedError: materialized views may not be defined using bound parameters
我实际上并不想要绑定参数,我想使用提供的值定义一个具体化视图。如果不是担心注入,我们只会在查询字符串本身中插入结果路径。
我是否在使用某种正则表达式手动验证用户控制的变量时遇到困难?我显然需要担心单引号、括号、大括号、注释字符、转义符等。path
最好的出路是什么?
答: 暂无答案
评论
path
:result_path\:\:float
'^[+-]?\d*(\.\d*)?(e[+-]?\d+)?$'