提问人:László Ács 提问时间:7/12/2023 更新时间:7/12/2023 访问量:77
如何使用 SQLAlchemy/SQLModel 避免 JSONPATH 中的 SQL 注入
How to avoid SQL injection in JSONPATH with SQLAlchemy/SQLModel
问:
我想避免在使用 SQLModel 查询的 JSON 路径部分中注入 SQL。我还没有找到以安全的方式为 JSON 路径部分提供参数的解决方案。
假设我们有一个数据库访问函数,如下所示:
from sqlmodel import Session, func, select
def some_fn(session: Session, value: str) -> list[DbItem]:
statement = select(DbItem).where(
func.jsonb_path_exists(
DbItem.json_field,
f'$[*] ? (@.id == "stg") ? (@.val == "{value}")',
),
)
return db.exec(statement).all()
然后我们可以使用以下值调用此函数: 其计算结果为 true。value='" || ""=="'
在这种情况下,避免注射的首选解决方案是什么?
答:
3赞
Laurenz Albe
7/12/2023
#1
执行此操作的规范方法是在 JSONPATH 表达式中使用变量,例如
jsonb_path_exists(
a_jsonb,
'$[*] ? (@.id == "stg") ? (@.val == $value)',
jsonb_build_object('value', 'something')
)
您可以使用查询参数而不是常量,这样您就不必编写字符串文字。'something'
评论