跳至主要內容
>_ITDITD網站資安平台

各框架對策

Next.js 資安 — 正式環境的加固參考

Next.js 正式環境的加固參考:優先順序清單,加上伺服器與用戶端的邊界與環境變數、相依套件 CVE、Server Actions 授權、SSRF、標頭/CSP,以及速率限制,並附上自我驗證清單。以防禦為主,不含攻擊步驟。

發布於 2026-07-02 更新於 2026-07-02 閱讀時間 3 分鐘

適用對象:任何在經營 Next.js 應用程式的人(假設使用 App Router)。這裡不談攻擊步驟——這是一份加固用的可實作參考:依優先順序排列的清單、各面向的指引,以及自我驗證。想看跨框架的全貌,請見 各框架資安對策的入口

依優先順序排列的加固清單

由上而下處理這張表。P0 是前提,P1 是最常見的事故來源,P2 是持續性的維運衛生。

P0 ── 前提(先做這個)

機密僅留在伺服器/相依套件 CVE 監控+迅速修補/鞏固正式環境設定

P1 ── 最主要的事故來源

Server Actions/Route Handlers 授權+輸入驗證/伺服器端抓取的 SSRF

P2 ── 維運衛生

標頭/CSP/驗證、工作階段、cookie/速率限制

由地基往上加固:P0(前提)→ P1(最主要的事故來源)→ P2(維運衛生)。
優先度控制項具體做法(Next.js)
P0機密僅留在伺服器只有可安全載入瀏覽器的值才加 NEXT_PUBLIC_;機密只放在 Server Component/Action/Route Handler
P0相依套件 CVEnpm audit/osv-scanner 監控;以正在運行的版本判定,迅速修補。跟上核心 RCE
P0正式環境設定執行正式環境建置;別在錯誤中洩漏內部資訊(stack/env)
P1Action 授權每個 Server Action/Route Handler 都要有驗證+限定擁有者範圍的授權
P1輸入驗證對輸入做 schema 驗證(型別/範圍/允許值)。別信任用戶端
P1SSRF 防護把伺服器端 URL 抓取限制在允許清單+阻擋內部 IP/中繼資料。限制圖片的遠端 pattern
P2標頭/CSPnext.config 設定安全標頭+HSTS。App Router 上可考慮以 nonce 為基礎的 CSP
P2驗證/cookie工作階段 cookie 設定 Secure/HttpOnly/SameSite。別把授權只交給 middleware
P2速率限制對驗證、Server Actions 與 Route Handlers 設限

1. 伺服器與用戶端的邊界與環境變數(P0)

Next.js 最大的事故來源,是本應僅留在伺服器的機密最後跑到了用戶端。

  • **只有可安全載入瀏覽器的值才加 NEXT_PUBLIC_。**API 金鑰或連線資訊絕不加(NEXT_PUBLIC_ 的值會在建置時被燒進用戶端 bundle,訪客看得見)。
  • 機密只在 Server Components/Server Actions/Route Handlers 內讀取,並讓它們遠離 props 與回應(序列化後的值)。
  • 讓伺服器專用的模組不被用戶端匯入(不小心含入可能把機密打包進去)。請見 .env 檔案與機密

2. 相依套件 CVE 與核心(P0)

  • npm audit 或 osv-scanner 對相依套件(npm)的 CVE 做機器監控以正在運行的版本判定,並迅速修補(依實際安裝的東西判斷,而非 package.json 的宣告)。
  • Next.js 核心曾出現嚴重的 RCE,所以一旦有公開就要迅速跟上。關於維運紀律,請見 不在 CVE 上掉隊;至於實務,請見 漏洞應變實務手冊
  • 讓 Node/Next 維持在受支援的版本,別放著 EOL 版本不管。

3. Server Actions/Route Handlers(授權+驗證,P1)

這些是**公開的伺服器入口。**能被呼叫不等於被允許。

常見(危險)

  • 把 action 當成「有登入=被允許」
  • 只依賴 middleware 的驗證,沒有擁有者檢查
  • 未經驗證就把輸入傳給 DB 或外部呼叫
  • 原封不動地信任用戶端提供的值(ID、旗標)

正確

  • 每個 action/handler 都要有驗證,加上限定擁有者/權限範圍的授權
  • 別交給 middleware(在資料附近做授權)
  • 對輸入做 schema 驗證(型別/範圍/允許值)
  • 在伺服器端重新驗證,讓替換 ID 的手法無效

請見 什麼是 IDOR。在每一條讀取/更新/刪除的路徑上都做擁有者檢查。

4. SSRF 與伺服器端抓取(P1)

在伺服器端抓取使用者提供的 URL(圖片代理、webhook、抓取中繼資料)是 SSRF 的入口。

  • 把目標限制在允許清單,並在連線時阻擋觸達私有 IP 與雲端中繼資料(169.254.169.254)。
  • 圖片最佳化的遠端 pattern 保持在最少(別允許抓取任意主機)。
  • 請見 什麼是 SSRF。本站讓對外抓取都通過一個 SSRF 安全閘道。

5. 注入與輸出

  • XSS:React 預設會跳脫輸出。別把使用者輸入傳給 dangerouslySetInnerHTML(若真有需要,僅在清理後再用)。請見 什麼是 XSS
  • SQL/注入:用 ORM/參數佔位符綁定;絕不用字串串接來組查詢(→ 什麼是 SQL 注入)。
  • 別把外部輸入傳給 eval 這類危險的求值。

6. 安全標頭與 CSP(P2)

  • next.config 設定安全標頭(X-Content-Type-Options 等)與 HSTS。用 安全標頭檢查工具 檢查你自己的網站。
  • 在 App Router 上,可考慮以 nonce 為基礎的 CSP(避免全面允許 inline script)。請注意,要與分析/廣告標籤共存需要一些設計。

7. 驗證、工作階段、cookie(P2)

  • 在工作階段 cookie 上設定 Secure/HttpOnly/SameSite
  • 別把授權只交給 middleware 的驗證——middleware 只是補強;在 action/handler/資料層驗證實際的判斷(某些路徑可能繞過 middleware)。
  • 登入時適當地重新產生並讓工作階段過期。

8. 速率限制(P2)

  • 驗證、Server Actions 與 Route Handlers 套用嘗試/流量限制,以抑制暴力破解、濫用與 DoS。

驗證:你的 Next.js 真的加固好了嗎?

做出來還不是結束——只有在檢查過之後才算完成。以下是針對你自己網站/環境的防禦性自我檢查。

1

沒有機密洩漏到用戶端

在瀏覽器的原始碼檢視或 bundle 中,確認沒有包含任何 API 金鑰或機密,且你沒有把機密加上 NEXT_PUBLIC_
2

正式環境不在錯誤時洩漏內部資訊

觸發一個錯誤,確認對外不會顯示 stack trace 或環境變數
3

Action 授權站得住腳

在測試環境中,請求另一位使用者的資源 ID,確認 Server Action/Route Handler 會拒絕(讀取/更新/刪除)。
4

標頭、相依套件、SSRF

標頭檢查工具 檢查你的網站,確認 npm audit/osv 乾淨,且對外抓取無法觸達內部 IP。

本站的觀點:要管理的是『邊界與相依套件』,而非核心

本站跑在 Next.js 上,防禦的重心不是花俏的設定,而是伺服器與用戶端的邊界,以及相依套件的鮮度。機密留在伺服器,公開入口(Server Actions/Route Handlers)一律附上授權與輸入驗證,相依套件在每次部署前都做 CVE 稽核。本站自身的出身正是一起「放任的 CVE 被自動利用」的事故,所以對相依套件做機器監控是最優先的習慣。對外的 URL 抓取都通過一個 SSRF 安全閘道,讓它們無法觸達內部 IP 或中繼資料。

接下來讀

FAQ

Q要保護 Next.js,我該先做什麼?
A

三個 P0 項目:(1) 讓機密僅留在伺服器(只有可安全載入瀏覽器的值才加 NEXT_PUBLIC_,API 金鑰或連線資訊絕不加);(2) 對相依套件 CVE 做機器監控,以正在運行的版本判定,並迅速修補(含核心 RCE);(3) 鞏固正式環境設定(執行正式環境建置;別在錯誤中洩漏內部資訊)。接著再進到 Server Actions/Route Handlers 的授權與輸入驗證,以及 SSRF 防護。

Q環境變數該怎麼安全處理?
A

原則是『機密留在伺服器』。只有可安全載入瀏覽器的值才加 NEXT_PUBLIC_,API 金鑰或連線資訊絕不加(NEXT_PUBLIC_ 的值會在建置時被燒進用戶端 bundle,訪客看得見)。機密只在伺服器元件/Server Actions/Route Handlers 內讀取,並在設計上讓它們絕不會混進 props 或回應。

Q使用 Server Actions 要注意什麼?
A

Server Actions 和 Route Handlers 是公開的伺服器入口。能被呼叫不等於被允許。除了登入(驗證),還要寫上把每個操作範圍限定到擁有者的授權,並務必驗證輸入(例如 schema 驗證)。別只依賴 middleware 的驗證——在 action/handler 裡也要做擁有者檢查。

Q我該如何為 SSRF 做準備?
A

主要入口是在伺服器端抓取使用者提供的 URL(圖片代理、webhook、抓取中繼資料)。把目標限制在允許清單,並在連線時阻擋觸達私有 IP 與雲端中繼資料(169.254.169.254)。把圖片最佳化的遠端 pattern 保持在最少。細節請見名詞說明。

Qnpm 相依套件的漏洞該如何管理?
A

用 npm audit 或 osv-scanner 對已知 CVE 做機器監控,以正在運行的版本判定,並迅速修補(依實際安裝的東西判斷,而非 package.json 的宣告)。Next.js 核心曾出現嚴重的 RCE,所以迅速跟進很重要。同時讓 Node/Next 維持在受支援的版本,別放著 EOL 版本不管。