编程 PHP ext-pgsql 的 SQL 注入:pg_insert/pg_update 的 E'...' 转义坑(CVE-2026-17543)

2026-09-04 21:01:47

PHP 安全更新 8.2.33 / 8.3.33 / 8.4.24 / 8.5.9:修复 ext-pgsql SQL 注入(CVE-2026-17543)

PHP 8.2.33 / 8.3.33 / 8.4.24 / 8.5.9 这批安全更新中,最值得留意的是一个高风险 SQL 注入:CVE-2026-17543,出在 PostgreSQL 扩展 ext-pgsql。

漏洞范围

影响 pg_insert()pg_update()pg_select()pg_delete() 四个辅助函数。它们底层会把 PHP 数组拼成 SQL 的 INSERT/UPDATE/SELECT/DELETE 语句,问题出在对字符串值的转义上——通过 E'...' 反斜杠转义字符串字面量时,反斜杠转义可以被绕过,造成注入。

受影响版本:

  • 8.2.x < 8.2.33
  • 8.3.x < 8.3.33
  • 8.4.x < 8.4.24
  • 8.5.x < 8.5.9

只有用 ext-pgsql 连接外部 PostgreSQL 的应用受影响;走 MySQL/MariaDB 的不涉及。

这意味着什么

很多人写 PHP 时图省事直接调 pg_insert($conn, 'users', $data),以为把数据当数组传就“天然防注入”。这个洞恰好说明:这些辅助函数内部对 E'...' 字符串的拼接/转义并非对所有输入都安全,攻击者通过精心构造的字符串内容可以在 E'...' 上下文中逃逸,拼出额外 SQL。

排查与修复

  1. 立即升级到 8.2.33+ / 8.3.33+ / 8.4.24+ / 8.5.9+。
  2. 升级前自查代码里有没有直接用 pg_insert / pg_update / pg_select / pg_delete,尤其是把用户可控字段(URL 参数、请求体里的文本)直接喂进去的地方。
  3. 长期建议:这些 pg_* 辅助函数只适合“内部固定数据”的批处理;凡是触碰用户输入的写库,改走 pg_query_params() + 占位符($1$2),让 PostgreSQL 端做参数化,别依赖 PHP 侧拼串转义。
  4. 顺带一起修的还有:BCMath bccomp() 越界写(CVE-2026-17544,8.4/8.5)、Phar 递归符号链接崩溃(CVE-2026-7260)、捆绑 libgd(CVE-2026-9672)。

参考资料:

复制全文 生成海报 PHP SQL注入 PostgreSQL 安全公告

推荐文章

程序员茄子在线接单