如何使用execute()创建PostgreSQL角色并规避SQL注入风险?
安全解决PostgreSQL角色创建的引号与注入问题
直接用psycopg2提供的quote_ident函数就能搞定,这是专门用来安全处理PostgreSQL标识符(比如角色名、表名)的工具,既能自动添加正确的双引号,又能彻底避免SQL注入风险。
具体实现步骤:
- 先导入
quote_ident工具:
from psycopg2.extensions import quote_ident
- 修改你的方法,用
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
相关产品推荐
相关产品推荐

