觀點 · 資訊分享

PHP 四個版本同日推出安全更新:用 pg_select() 的網站有 SQL 注入風險,bccomp() 還可能寫壞記憶體

PHP 在 7 月 30 日同時釋出 8.2.33、8.3.33、8.4.24、8.5.9。其中官方標為 High 的兩個漏洞:PostgreSQL 的 pg_insert 等函式轉義不完整,以及 bccomp() 的越界寫入。

發布
2026-07-30
篇幅
約 5 分鐘 · 2,103 字
結構
8 節 + 3 題常見問題
標籤
#PHP#SQL 注入#CVE-2026-17543#CVE-2026-17544#資安更新
PHP 四個版本同日推出安全更新:用 pg_select() 的網站有 SQL 注入風險,bccomp() 還可能寫壞記憶體

一句話看懂:PHP 在 7 月 30 日同時推出 8.2.33、8.3.33、8.4.24、8.5.9 四個安全更新,修掉兩個官方標為 High 的漏洞,其中一個讓連 PostgreSQL 的程式可能被 SQL 注入。

PHP 四個版本同日修資安資訊圖卡:連 PostgreSQL 的 PHP 網站要升級:pg_select() 等函式可被 SQL 注入

先用白話講:SQL 注入是什麼?

想像你在櫃台填表單,櫃台人員會把你寫的名字原封不動貼到一張「查詢單」上,交給後面的檔案室去找資料。如果你的名字欄寫的不是名字,而是「叫檔案室把所有人的資料都拿出來」,櫃台又沒有檢查就照貼,檔案室就會照做。

這就是 SQL 注入:網站把使用者輸入的文字,直接當成資料庫指令的一部分。防止它的方法,是在貼上之前先把危險的符號「轉義」,讓它只當成普通文字。

這次的問題,就是 PHP 自己的轉義做得不夠完整。

發生什麼事

PHP 在 7 月 30 日同時釋出 8.2.33、8.3.33、8.4.24、8.5.9 四個版本,官方說明都是安全更新。更新紀錄裡有 4 項有 CVE 編號的修正,其中兩個被官方標為 High:

CVE 影響 受影響版本
CVE-2026-17543 PostgreSQL 擴充套件的 pg_insert()、pg_update()、pg_select()、pg_delete() 轉義不完整,可被 SQL 注入 8.2、8.3、8.4、8.5
CVE-2026-17544 bccomp() 在特定輸入下可能寫到緩衝區之外,造成堆疊或堆積記憶體被破壞 只有 8.4、8.5

另外兩項也一併修了:Phar 遇到遞迴符號連結會當機(CVE-2026-7260),以及升級內建的 libgd(CVE-2026-9672)。

第一個漏洞到底怎麼回事?

根據 GitHub 上的官方公告,這四個函式會先用 PostgreSQL 的轉義函式處理使用者資料,再包進 E'...' 這種「跳脫字串」的格式。

問題是:PostgreSQL 從 9.1 版起預設開啟 standard_conforming_strings,在這個預設下,轉義函式不會處理反斜線 \,卻把單引號變成兩個。結果攻擊者可以用一個反斜線,把其中一個單引號「吃掉」,另一個單引號就變成字串的結尾,後面的內容會被當成資料庫指令。

也就是說,用預設設定的 PostgreSQL、又在這四個函式裡塞使用者輸入的網站,就在這個漏洞的範圍內。修法是改成把參數包進「不處理跳脫」的一般字串常數。

第二個漏洞

bccomp() 是比較兩個大數字的函式。官方說明,當呼叫者指定了精度(scale),把數字截短、又去掉結尾的零時,程式只縮小了配置的空間,卻拿原本的長度去複製,造成寫到緩衝區之外。這個漏洞只在 PHP 8.4 與 8.5。

給開發者的技術細節

先確認版本與有沒有用到相關函式:

php -v
grep -rnE "pg_(insert|update|select|delete)\(" ./src
  • 升級目標:8.2.33、8.3.33、8.4.24、8.5.9,也就是同一個系列的最新修補版
  • 用主機商或作業系統套件的人,要確認套件有沒有已經回補修正;版本號沒變不代表沒修
  • 用 Docker 的人,要重新建立映像檔,只升級本機開發環境沒有用
  • 這四個函式本來就是「圖方便」的封裝;長期做法是改用 PDO 或 pg_query_params() 這類參數化查詢

我的看法

PHP 現在的新專案比以前少,但接案時一定會碰到維護舊網站的需求:WordPress、舊的客製後台,常常 PHP 版本很久沒動。這類網站的問題通常不是漏洞多難,而是「沒人記得它跑在哪台主機上」。

這次的實用做法很簡單:先 php -v 看版本,再 grep 有沒有用到這四個函式。沒用到,就在下次維護時一併升級;用到,就盡快升級並在這週內處理。

另外要提醒,公告列出的受影響與修補範圍只有 8.2 到 8.5。如果你的網站還跑在更舊的版本,這次官方公告裡沒有為它列出修補版本,更需要把升級排進計畫。

名詞小辭典

  • SQL 注入(SQL Injection):把惡意內容塞進輸入欄位,讓資料庫把它當指令執行的攻擊方式。
  • 轉義(Escape):把輸入裡有特殊意義的符號,改成普通文字的處理方式。
  • 越界寫入(Out-of-bounds write):程式把資料寫到配置好的記憶體範圍之外,可能造成當機,甚至被利用來執行惡意程式。
  • CVE:全球通用的資安漏洞編號,方便各方用同一個名字討論同一個漏洞。

資料來源

常見問題

哪些 PHP 版本要升級?
8.2 要升到 8.2.33、8.3 升到 8.3.33、8.4 升到 8.4.24、8.5 升到 8.5.9。pg_select 那個 SQL 注入漏洞四個系列都有;bccomp 的漏洞只影響 8.4 與 8.5。
我的網站用 PostgreSQL,一定會中招嗎?
不一定。官方公告指出問題出在 pg_insert()、pg_update()、pg_select()、pg_delete() 這四個函式處理使用者輸入的方式,沒用到它們的程式,不在這份公告說明的範圍內。但升級仍然是最保險的做法。
怎麼確認自己的 PHP 版本?
在主機上執行 php -v 就能看到版本;用 Docker 或主機商環境的人,要確認的是實際跑網站的那個環境,而不只是本機開發機。
LINE