適用對象:任何在經營 Next.js 應用程式的人(假設使用 App Router)。這裡不談攻擊步驟——這是一份加固用的可實作參考:依優先順序排列的清單、各面向的指引,以及自我驗證。想看跨框架的全貌,請見 各框架資安對策的入口。
依優先順序排列的加固清單
由上而下處理這張表。P0 是前提,P1 是最常見的事故來源,P2 是持續性的維護。
P0 ── 前提(先做這個)
機密僅留在伺服器/相依套件 CVE 監控+迅速修補/檢查正式環境設定
P1 ── 最主要的事故來源
Server Actions/Route Handlers 授權+輸入驗證/伺服器端抓取的 SSRF
P2 ── 持續維護
標頭/CSP/驗證、工作階段、cookie/速率限制
| 優先度 | 控制項 | 具體做法(Next.js) |
|---|---|---|
| P0 | 機密僅留在伺服器 | 只有可安全載入瀏覽器的值才加 NEXT_PUBLIC_;機密只放在 Server Component/Action/Route Handler |
| P0 | 相依套件 CVE | 用 npm audit/osv-scanner 監控;以正在運行的版本判定,迅速修補。跟上核心 RCE |
| P0 | 正式環境設定 | 執行正式環境建置;別在錯誤中洩漏內部資訊(stack/env) |
| P1 | Action 授權 | 每個 Server Action/Route Handler 都要有驗證+限定擁有者範圍的授權 |
| P1 | 輸入驗證 | 對輸入做 schema 驗證(型別/範圍/允許值)。別信任用戶端 |
| P1 | SSRF 防護 | 把伺服器端 URL 抓取限制在允許清單+阻擋內部 IP/中繼資料。限制圖片的遠端 pattern |
| P2 | 標頭/CSP | 在 next.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 真的加固好了嗎?
做出來還不是結束——只有在檢查過之後才算完成。以下是針對你自己網站/環境的防禦性自我檢查。
沒有機密洩漏到用戶端
NEXT_PUBLIC_。正式環境不在錯誤時洩漏內部資訊
Action 授權站得住腳
標頭、相依套件、SSRF
npm audit/osv 乾淨,且對外抓取無法觸達內部 IP。本站的觀點:重點放在伺服器與用戶端的邊界,以及相依套件
本站跑在 Next.js 上,重點不是特別的設定,而是伺服器與用戶端的邊界,以及讓相依套件保持最新。機密留在伺服器,任何人都能呼叫的函式(Server Actions/Route Handlers)一律附上授權與輸入驗證,相依套件在每次部署前都做 CVE 稽核。本站是在一起「未修補的 CVE 被自動化攻擊利用」的事故之後創立的,所以對相依套件做機器監控是最優先的習慣。對外的 URL 抓取都通過一個 SSRF 安全閘道,讓它們無法觸達內部 IP 或中繼資料。
接下來讀
- 入口:各框架資安對策 · Laravel 資安對策
- 相依套件:不在 CVE 上掉隊 · 漏洞應變實務手冊
- 名詞:什麼是 IDOR · 什麼是 SSRF · .env 檔案與機密 · XSS
- 工具:安全標頭檢查工具
來源與確認範圍
以下原始資料支持上文的設定、影響範圍或應對措施,連結於2026年10月23日確認。請核對資料中的版本與設定條件。清單優先順序及經驗是本站的整理,不代表全文重新核驗或安全保證。