【问题标题】:psycopg2 partial identifierpsycopg2 部分标识符
【发布时间】:2022-01-20 03:43:00
【问题描述】:
_sql = sql.SQL("SELECT * FROM {prefix}_prefixed_table_name").format(prefix=sql.Identifier("prefix"))

_sql.as_string(conn)

结果SELECT * FROM "prefix"_prefixed_table_name

我想要什么SELECT * FROM prefix_prefixed_table_nameSELECT * FROM "prefix_prefixed_table_name"

我怎样才能做到这一点?

作为klin 的请求,为什么不这样做

_sql = sql.SQL("SELECT * FROM {prefix}_prefixed_table_name").format(prefix=sql.SQL("prefix"))

工作,可以直接进入

"another_table_name; -- "

这会导致

SELECT * FROM another_table_name; -- _prefixed_table_name

【问题讨论】:

    标签: python sql database postgresql psycopg2


    【解决方案1】:

    将表名移动到Identifier():

    _sql = sql.SQL("SELECT * FROM {name}").format(name=sql.Identifier(prefix+ "_prefixed_table_name"))
    

    【讨论】:

    • 据我所知,直接传递 SQL 并不能保护我免受 SQL 注入。
    • 展示一个这样的注入示例。
    • 编辑问题以显示示例
    • 好的,查看更新后的答案。
    • 现在这修复了 sql 注入(删除了对此的反对票),但是查询的其余部分由几个 for 循环中的很多东西组成,因此我需要以某种方式将它合并到查询中就像 SQL 对受信任的 SQL 或 Identifier 对标识符所做的那样神奇。不过,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 2011-11-10
    • 2016-10-28
    • 2010-11-02
    相关资源
    最近更新 更多