如何使用 SQLAlchemy/SQLModel 避免 JSONPATH 中的 SQL 注入

How to avoid SQL injection in JSONPATH with SQLAlchemy/SQLModel

提问人:László Ács 提问时间:7/12/2023 更新时间:7/12/2023 访问量:77

问:

我想避免在使用 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='" || ""=="'

在这种情况下,避免注射的首选解决方案是什么?

PostgreSQL SQLalchemy SQL注入 SQLMold

评论


答:

3赞 Laurenz Albe 7/12/2023 #1

执行此操作的规范方法是在 JSONPATH 表达式中使用变量,例如

jsonb_path_exists(
   a_jsonb,
   '$[*] ? (@.id == "stg") ? (@.val == $value)',
   jsonb_build_object('value', 'something')
)

您可以使用查询参数而不是常量,这样您就不必编写字符串文字。'something'