十月 14 日到 21 日,短短一週內,支撐全球大量網站的三個基礎元件陸續發布安全更新:nginx 在 14 日推出 1.30.6 與 1.31.7,修補五項漏洞;PHP 與 Node.js 則在同一天(21 日)各自發布更新,其中 PHP 修補的兩個漏洞可讓未經身分驗證的攻擊者遠端執行任意程式碼。
對多數企業來說,這類新聞的結局通常是「看過、轉貼、然後忘記」。但真正決定風險高低的,往往不是漏洞本身有多嚴重,而是有沒有人知道自己的網站跑的是哪一個版本,以及從發現到修補要花多久。
這一週到底公布了什麼
| 元件 | 公告日期 | 重點 | 修補版本 |
|---|---|---|---|
| nginx | 10 月 14 日 | 五項漏洞,涵蓋 TLS session ticket 偽造、HTTP/3 請求注入、AIO use-after-free 等;官方嚴重度標示為 medium,但多家資安媒體與廠商評估其中包含可能導致遠端程式執行與 TLS 繞過的問題 | 1.30.6 / 1.31.7 |
| PHP | 10 月 21 日 | CVE-2026-109618 與 CVE-2026-109619,可讓未經身分驗證的請求觸發遠端程式執行;官方明確表示「沒有完整的緩解方式,更新是唯一安全的選擇」 | 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 |
| Node.js | 10 月 21 日 | 多項漏洞,包含 Brotli 解碼越界寫入(可導致遠端程式執行)與兩項 TLS 憑證主機名稱驗證繞過 | 22.23.4 / 24.22.1 / 26.12.1 |
nginx 這次的五項漏洞,受影響範圍最廣的一項可追溯到 0.1.29 版。換句話說,一台多年沒有更新過的 nginx,幾乎確定落在受影響區間內。
PHP 的狀況更值得注意。官方公告列出的受影響對象是「所有以 PHP 處理網頁請求的環境」,包含 PHP-FPM、Apache 的 mod_php、php-cgi、FrankenPHP 與 LiteSpeed,其中 mod_php 的風險最高。這幾乎涵蓋了台灣中小企業網站最常見的部署方式。
而 Node.js 的兩項 TLS 主機名稱驗證繞過,不會讓網站癱瘓,卻可能讓憑證驗證失效——屬於「安靜但嚴重」的類型。這類問題通常不會出現在客服通報裡,只會出現在事後調查裡。
漏洞不是新問題,「沒有人負責更新」才是
在協助醫療院所與中小企業維護網站的經驗裡,我們看到三種反覆出現的狀況。
一、網站是幾年前做的,版本資訊已經失傳。 主機商、外包廠商、歷任 MIS 各持一部分資訊,沒有人能回答「我們現在跑的是哪一版」。
二、用 AI 做出來的工具,沒有人接手維護。 這是近兩年新增的狀況。AI 讓非工程背景的人也能做出可用的網頁與小工具,但工具完成後,當初被安裝的那些執行環境與套件就留在電腦或主機上,不會有人主動通知你「該更新了」。
三、更新被當成一場賭局。 因為沒有回滾方案、沒有測試環境,更新等於「祈禱網站不要壞」,於是「先不要動」就變成最合理的選擇。
這三件事的共同點是:它們都不是技術難題,而是維運流程的問題。
次世代網站的三個結構性差異
所謂「次世代網站」,在資安語境下不是指視覺多花俏或功能多齊全,而是指它的技術結構讓「回答版本問題」與「執行修補」變成一件低成本的事。以我們自己的官網為例,有三個具體差異。
一、攻擊面小,而且可以列舉。 整站採靜態預渲染,執行期只有 3 個需要伺服器處理的端點(兩個表單與一個轉址),主機上沒有 PHP、也沒有資料庫。這意味著這次 PHP 那兩個漏洞對本站不存在攻擊面——不是因為我們修得比較快,而是那個執行環境根本不在主機上。
二、相依清單只有一個來源。 專案的執行期相依套件只有 5 個、開發相依 4 個,全部鎖在 6,050 行的 package-lock.json 裡,每次部署都以 npm ci 從鎖檔安裝。要回答「我們用了哪些套件、哪個版本」,是一行指令的事,而不是一場考古。
三、修補可以小步快跑,而且能回頭。 每次部署都產生一個完整的新版本目錄,驗證通過才切換上線,失敗就切回上一版。因為成本低,修補就不必等到「下一次大改版」才一起做。
AI 代理能幫上什麼忙,不能幫上什麼忙
AI 代理(AI Agent)在這個流程裡最有價值的地方,不是替你寫網站,而是把「讀官方公告、對照版本區間、找出專案實際使用的版本、產出升級與回滾步驟、驗證結果」這條鏈路自動化。這些動作本身不難,但很花時間,而且容易因為英文公告難讀、版本區間寫法複雜而出錯。
它不能取代的是:
- 對風險的判斷與責任(哪些系統可以先動、哪些要排維護窗)
- 對「有沒有漏」的保證(AI 說沒問題,只代表它檢查過的範圍沒問題)
- 未經審閱就對正式環境動手的權限
以下五段指令,是我們實際在用的下法。共同原則是:要求它貼出實際指令輸出、要求它承認無法判斷的部分、要求先計畫再執行。
一、先盤點,不准動手
角色:你是我的網站維運代理。這個階段只能讀取,不能修改任何檔案、設定或服務。
任務:盤點這個網站實際執行的軟體與版本。
1. 用實際指令取得版本,不要用你記憶中的版本:node -v、npm -v、nginx -v、command -v php。
2. 讀 package.json 與 package-lock.json,列出直接相依套件與實際鎖定的版本。
3. 分別說明:哪些軟體在「執行期」會用到、哪些只在建置期使用、哪些根本不存在於這台主機。
4. 只列事實與你執行過的指令,不要下結論、也不要建議升級。
為什麼這樣下: 一開始就明確禁止變更,避免代理邊查邊動手;要求「實際指令輸出」,是為了排除它用訓練資料裡記得的版本回答;要求區分執行期與建置期,是因為許多誤判來自把建置工具當成線上服務,兩者的風險等級完全不同。
二、拿官方公告對照,要求標記「無法判斷」
以下是我要核對的官方安全公告:(貼上官方連結,例如 nginx 的 security advisories、
Node.js 的 security releases、PHP 的 archive 公告)
任務:
1. 逐一列出公告中的每個漏洞:識別碼、嚴重度、受影響版本區間、修復版本。
2. 對照上一階段的盤點結果,標記「受影響/不受影響/無法判斷」,並寫出判斷依據。
3. 若某個漏洞的觸發條件在目前的設定下不成立(例如沒有啟用該模組、沒有該執行環境),請說明理由。
4. 公告裡查不到的資訊,直接寫「公告未提供」,不要推測。
為什麼這樣下: 貼官方連結而不是讓它自己找,是為了避免引用二手部落格或過期資訊;要求三種標記,是因為「無法判斷」才是最誠實、也最需要人工補位的狀態;禁止推測,是為了避免它在版本區間上隨意外推。
三、先給計畫,含回滾與驗證
根據前面比對出的受影響項目,產出一份升級計畫:
- 目標版本與升級原因(對應哪一個 CVE)
- 影響範圍:會動到哪些檔案、服務、設定
- 風險:這次升級可能破壞什麼?有沒有已知的行為變更(breaking change)?
- 回滾方案:升級失敗時如何回到目前版本?請寫出具體指令
- 驗證方式:升級後用什麼檢查,證明修補生效且網站正常?
- 執行順序:分成「建置」「切換」「驗證」三個階段,每階段列出指令
先只給計畫,不要執行。等我確認後再進行;任何刪除或不可逆的操作都要先問我。
為什麼這樣下: 「回滾方案」與「驗證方式」是最常被跳過的兩個欄位,也最容易在出事時救命。要求它分成三個階段,等於把「改壞了、但還沒對外」的窗口留在可控範圍內。
四、驗證要貼原始輸出,不接受口頭保證
請驗證修補是否真的生效,並貼上你實際執行的指令與原始輸出。
不要用「應該已經修好了」這種結論。
至少包含:
1. 版本確認:node -v、nginx -v。
2. 對外服務:curl -sI https://(你的網域)/ 的狀態碼,以及 Content-Security-Policy、
Strict-Transport-Security 等安全標頭是否仍然存在。
3. 主要頁面:首頁、列表頁、表單頁各自回應的狀態碼。
4. 相依套件:npm audit 的摘要結果。
5. 任何一項沒通過,請直接說明沒通過,不要美化。
為什麼這樣下: AI 很容易把「理論上修好了」講成「已經修好了」。要求原始輸出,等於把驗證責任放回可稽核的證據上;要求檢查安全標頭,是因為升級過程最常見的副作用不是服務掛掉,而是某個回應標頭默默消失,而那種情況幾乎不會有人回報。
五、每月例行一次
每月例行檢查,請做三件事,並各用一句話總結:
1. 比對目前使用的 Node.js 與 nginx 版本,是否仍等於官方最新安全公告中的修復版本。
2. 執行 npm audit,列出 high 與 critical 的項目。
3. 回報網站對外的安全標頭是否與上個月一致。
只回報差異與需要我決定的事項,正常項目不用展開。
我們自己的紀錄
這一輪公告之後,我們在官網主機上做的檢查,結果如下(皆為實際指令輸出):
nginx -v→ nginx/1.30.6,正好落在官方標示「1.30.6 以上不受影響」的修補線上node -v→ v24.22.1,為 10 月 21 日公告的修補版本之一command -v php→ 無輸出,主機上沒有 PHP 執行環境curl -sI https://www.eline.com.tw/→ HTTP/2 200,Content-Security-Policy、X-Frame-Options 等標頭皆存在
把這四行留在維運紀錄裡,比任何「我們很重視資安」的聲明更有說服力——因為它是可以被重複驗證的。
不用 AI 也能先做的五件事
即使暫時不導入 AI 代理,網站擁有者仍可先完成這五件事:
- 問出三個版本:Node.js、PHP(如果有)、nginx。
- 確認有沒有鎖檔:
package-lock.json或composer.lock,以及部署時是否真的照鎖檔安裝。 - 執行套件掃描:
npm audit或composer audit,優先處理 high 與 critical。 - 檢查對外標頭:
curl -I看 HSTS 與 CSP 是否還在(升級後最容易漏掉)。 - 確認可以回頭:上一版是否還留著、切回去的指令是否寫得出來。
五件事做完,你已經比大多數網站擁有者更清楚自己的風險位置。
給醫療與受監管產業的補充
醫療相關網站處理的是另一種等級的信任。即使網站本身不存放病歷,表單端點、寄信服務的金鑰、以及預約或諮詢紀錄,都屬於需要交代的範圍。我們建議把「公告 → 影響評估 → 修補 → 驗證」四個步驟留下書面紀錄:事件發生時能快速回應,稽核或客戶詢問時,這份紀錄就是最直接的答案。
三個界線:AI 助陣,不等於交給 AI
- 版本記憶會過期。 AI 對版本的認知停留在訓練資料,永遠以官方公告為準。
- 不要讓代理直接對正式環境動手。 先計畫、人工核可、保留回滾,這三步不能省。
- 金鑰與客戶資料不進 prompt。 需要 AI 協助排查時,使用遮蔽後的設定片段,不要貼真實金鑰。
結語
這一週的三起公告,對多數網站的實際衝擊或許不大;但它們同時提醒了一件事:風險不是在某一天突然出現的,而是在「沒有人負責更新」的那些日子裡慢慢累積的。
次世代網站的價值,不在於用了哪一個新框架,而在於它讓「確認版本、執行修補、驗證結果」變成一件幾十分鐘內能完成、而且失敗也能回頭的日常動作。有 AI 代理協助,這件事的門檻又更低了一些——前提是給它的指令夠清楚、也夠節制。
參考資料
- nginx security advisories:https://nginx.org/en/security_advisories.html
- nginx 2026 年版本公告(1.30.6 / 1.31.7):https://nginx.org/2026.html
- PHP 2026 年 10 月 21 日安全公告(CVE-2026-109618、CVE-2026-109619):https://www.php.net/archive/2026.php#2026-10-21-5
- Node.js October 2026 security releases:https://nodejs.org/en/blog/vulnerability/october-2026-security-releases
- 數位時代:PHP 爆兩個 9.2 分漏洞,一段提示詞用 AI 檢查軟體版本:https://www.bnext.com.tw/article/92773/20261022-vibe-security-patch

