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