You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用execute()创建PostgreSQL角色并规避SQL注入风险?

安全解决PostgreSQL角色创建的引号与注入问题

直接用psycopg2提供的quote_ident函数就能搞定,这是专门用来安全处理PostgreSQL标识符(比如角色名、表名)的工具,既能自动添加正确的双引号,又能彻底避免SQL注入风险。

具体实现步骤:

  1. 先导入quote_ident工具:
from psycopg2.extensions import quote_ident
  1. 修改你的方法,用quote_ident处理角色名和组名,密码部分保留参数化查询:
def creer_user(self, login, pwd, groupe):
    # 安全引用标识符,自动添加双引号并转义特殊字符
    quoted_login = quote_ident(login, self.cursor.connection)
    quoted_groupe = quote_ident(groupe, self.cursor.connection)
    quoted_app_role = quote_ident(G.APP, self.cursor.connection)

    # 构造创建角色的SQL,密码用参数化占位符
    queryrole = f"CREATE ROLE {quoted_login} WITH PASSWORD %s LOGIN NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1;"
    self.cursor.execute(queryrole, (pwd,))

    # 构造授权SQL,使用已安全处理的标识符
    querygrant = f"GRANT {quoted_app_role}, {quoted_groupe} TO {quoted_login};"
    self.cursor.execute(querygrant)

方案说明:

  • quote_ident会自动处理标识符中的特殊字符(比如空格、大小写敏感名称),给它加上符合PostgreSQL要求的双引号,同时转义内部的双引号,完全适配语法规则。
  • 密码部分依然用参数化查询%s,避免了值的注入风险。
  • 这是PostgreSQL官方推荐的安全处理标识符的方式,对比直接f-string拼接,彻底杜绝了SQL注入漏洞。

内容的提问来源于stack exchange,提问作者zonas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 20:09:30