怎样防止PostgreSQL中的堆叠查询注入_在驱动层禁用多语句执行

雨雪酱_2709

雨雪酱_2709

2026-05-10

413人浏览

原创

postgresql驱动默认禁用堆叠查询,防护关键在于驱动层拒绝多语句执行及代码中严格使用参数化查询;需验证各语言驱动行为、禁用字符串拼接、限制数据库权限并避免日志泄露原始sql。

怎样防止postgresql中的堆叠查询注入_在驱动层禁用多语句执行

PostgreSQL驱动默认不支持堆叠查询,但某些配置会绕过限制

PostgreSQL 协议本身允许一次请求发送多条语句(用分号分隔),但主流客户端驱动(如 psycopg2、pg for Node.js、PDO_PGSQL)在默认配置下**拒绝执行多语句**。这意味着即使攻击者输入 admin'; DROP TABLE users; --,只要用的是标准参数化方式,后半条 DROP TABLE 根本不会被发给服务器——不是数据库拦的,是驱动层先卡死了。

容易踩的坑在于:部分驱动提供显式开关来启用多语句,一旦开启,就等于主动打开堆叠注入大门。

  • psycopg2 中没有等效于 MySQL 的 multi_statements=True 选项,它天然禁止多语句;但若开发者手动拆解字符串、用 cursor.execute() 多次调用拼接后的 SQL,就等于自己绕过防护
  • node-postgres(pg)默认也禁用多语句;但若使用 client.query("SELECT ...; DROP ...") 直接传入含分号的字符串,且未设 statement_timeout 或连接级限制,可能触发异常行为(尤其在旧版本或自定义协议封装场景)
  • PDO_PGSQL 在 PHP 中,PDO::ATTR_EMULATE_PREPARES 设为 true 时,预处理会被客户端模拟,此时若输入含分号,有可能被错误解析——应始终设为 false

如何确认你的 PostgreSQL 驱动没开多语句通道

关键不是“怎么开”,而是“怎么确保它关着”。不同语言的验证方式不同,但逻辑一致:查文档 + 查运行时行为 + 看错误反馈。

  • Python + psycopg2:尝试执行含分号的原始查询,比如 cur.execute("SELECT 1; SELECT 2"),会直接抛出 psycopg2.ProgrammingError: multiple statements found —— 这是正常且期望的行为
  • Node.js + pg:同样执行 client.query("SELECT 1; SELECT 2"),新版(v8+)默认报错 Multiple statements detected;若没报错,说明底层用了非标准 client 或启用了 allowExitOnMultipleStatements 类似危险选项(该选项不存在于官方 pg,但某些 fork 或封装库可能加了)
  • PHP + PDO:执行 $pdo->query("SELECT 1; SELECT 2") 应失败并提示 ERROR: syntax error at or near ";";如果成功返回两行结果,说明驱动被魔改过,或用了非 PostgreSQL 原生协议适配器

比驱动设置更关键的防线:永远不用字符串拼接构造查询

驱动层禁用多语句只是兜底手段,真正起决定性作用的是代码写法。哪怕驱动允许多语句,只要不用拼接,攻击者就无法把分号塞进合法 SQL 结构里。

  • 所有用户输入必须走参数占位符:SELECT * FROM users WHERE name = %s(psycopg2)、SELECT * FROM users WHERE name = $1(pg/node)
  • 绝对避免用 f"SELECT * FROM users WHERE name = '{user_input}'" 或 "SELECT * FROM users WHERE name = '" + user_input + "'"
  • 动态表名/字段名等无法参数化的部分,必须用白名单校验:if table_name not in ['users', 'orders']: 而不是正则替换或简单截断
  • PostgreSQL 的 quote_ident() 和 quote_literal() 函数只应在极少数元编程场景下谨慎使用,不能替代参数化

生产环境还需配合数据库权限收紧

驱动层堵住多语句入口后,仍要防止攻击者利用已有的高权限账户执行破坏性操作。PostgreSQL 的角色权限模型非常精细,别让应用账号拥有它不需要的能力。

  • 应用连接不要用 postgres 超级用户,也不要给 app_user CREATEDB 或 CREATEROLE 权限
  • 只读接口对应的账号,应仅授予 SELECT 权限,且明确限定到具体表:GRANT SELECT ON TABLE users TO app_reader
  • 避免使用 GRANT ALL PRIVILEGES ON DATABASE mydb TO app_user —— 这类宽泛授权会让任何成功的注入都变得极其危险
  • 注意:PostgreSQL 不支持像 MySQL 那样通过 sql_mode=STRICT_TRANS_TABLES 禁用多语句,它的限制完全依赖客户端驱动和权限设计

最常被忽略的一点:很多团队花时间调 WAF 规则去拦截分号,却没检查自己的 ORM 是否在日志或调试模式下悄悄打印了原始 SQL 字符串——这些明文日志一旦泄露,等于把构造好的堆叠语句直接送给攻击者参考。

驱动精灵
驱动精灵

驱动精灵基于驱动之家十余年的专业数据积累,驱动支持度高,已经为数亿用户解决了各种电脑驱动问题、系统故障,是目前有效的驱动软件,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4283

8

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.27

891

4

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

2024.02.23

1109

5

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

6201

10

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

2024.03.06

3043

4

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

2024.04.07

6160

11

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

2024.04.29

8341

6

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

1130

5

sql中删除一列的命令是什么
sql中删除一列的命令是什么

在sql中,使用alter table语句可以删除一列,语法为:alter table table_name drop column column_name。想了解更多sql的相关内容,可以阅读本专题下面的文章。

2024.04.29

992

5

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 133.7万人学习