我明明加了『每小時限 20 次』防濫用,怎麼還是被人狂刷爆!
你在網站上加了防濫用限制(rate limit),程式碼明明寫了「每小時只能請求 20 次」,攻擊者卻照樣刷爆你。這不是你限制寫錯——你缺的詞叫「serverless 上的記憶體限流是假的」。這頁講一個「程式看起來有防護、其實是空殼」的可怕陷阱。
先說結論:你的限流不是「寫錯」,是它在 serverless 上「根本沒作用」。程式看起來有,實際是個空殼。
情境:你的網站/API 怕被人濫用(狂刷、爆量、洗資源),所以你(或幫你寫的 AI)加了限流:「每個 IP 每小時最多 20 次」。程式碼清清楚楚寫在那,你安心了。
結果還是被狂打。你檢查程式,限流的邏輯明明沒錯啊,數字也對。你百思不解。
問題不在你的邏輯。問題在你把它跑在 serverless 上——而 serverless 有個要命的特性,讓「用記憶體做的限流」變成一張廢紙。
你缺的詞 = in-memory 限流在 serverless 無效 / 需要 shared store
為什麼記憶體限流在 serverless 是假的?(人話版)
先搞懂 serverless 是什麼。傳統伺服器是「一直開著的一台機器」,它記得所有事。serverless 不是——它是「有人來才臨時開一台、忙完就關掉」,而且流量一大,會同時開很多台。
現在問題來了。你的限流計數器(「這個 IP 用了幾次」)是存在程式的記憶體裡的。但:
- 每台臨時機器有自己的記憶體。 平台開了 10 台機器分擔流量,就有 10 個各自獨立的計數器,彼此不知道對方。攻擊者的請求隨機落在不同機器上,每台都覺得「他才第 1 次」,你的「20 次上限」形同虛設。
- 機器一關再開(冷啟動),計數器歸零。 攻擊者根本不用等,換一台就重新計數。
所以你的「每小時 20 次」,實際上只在「同一台剛好還沒關的機器」的短暫壽命內有效——對真正的攻擊,等於沒有防護。
最可怕的是:程式碼明明在那、也接上了所有 API,看起來防護齊全。但它是空的。而且因為沒有監控、沒有告警,根本沒人會發現它沒在擋——直到被打爆。
正確做法:用「大家共用的計數器」
解法的核心:別把計數器放在各機器自己的記憶體,放到一個「所有機器共用」的地方。
兩條路:
- 共享儲存(Upstash Redis):這是 serverless 限流的標準解。計數器集中在一個地方,所有臨時機器都去問它「這個 IP 用幾次了」,冷啟動也不會歸零。
- ⚠️ 附帶陷阱:這種服務靠網路連線,萬一連不上可能會噴錯、把你整個 API 拖垮。要用 try/catch 包起來、設一個安全的 fallback。
- 平台級的防火牆/WAF 限流:如果你不想架額外的東西,很多平台(例如 Vercel)自己就有「防火牆層級」的限流,比你在程式裡自己寫的更可靠。
⚖️ 誠實說清楚:這個坑對「一直開著的傳統伺服器」不存在——只有 serverless(Vercel / Cloudflare Workers / Netlify / Lambda 這類「用完就關」的平台)才會中。但因為現在小生意架站超愛用 serverless(便宜、免維護),所以特別容易踩。核心教訓:「程式碼存在」不等於「功能真的生效」。你不能因為「限流的 code 在那」就宣稱「我有防濫用」——你需要證據(監控、告警)證明它真的有在擋。
你會搜錯的關鍵字 vs 該搜的正確詞彙
| 你崩潰時會打的(搜不到) | 該搜的正確詞彙 |
|---|---|
| 「我加了限流還是被刷爆」 | in-memory rate limit serverless |
| 「rate limit 沒作用」 | shared store / Upstash Redis rate limit |
| 「serverless 防濫用」 | WAF / platform-level rate limiting |
把右邊那欄丟進 Google、或直接貼給你的 AI。這就是我們在幹的事——把你崩潰時打出來的髒話,翻譯成能找到答案的詞。
🎁 直接貼給你的 ChatGPT / Claude
這一段免費。複製、貼上、送出——先讓你的 AI 動起來。
我在 serverless 平台(例如 Vercel / Cloudflare Workers / Netlify)上做了一個 API,用程式裡的一個變數(in-memory Map)來做限流「每小時每個 IP 最多 20 次」。但好像擋不住人,還是被狂打。 請告訴我: 1. 為什麼在 serverless 上,用「程式記憶體」做的限流幾乎沒有用?(跟每個實例各自獨立記憶體、冷啟動重置有關) 2. 攻擊者怎麼繞過這種限流? 3. 正確做法是什麼?(共享儲存像 Upstash Redis,或平台級的 WAF/防火牆限流) 4. 為什麼「程式碼存在」不等於「防護真的生效」?我該怎麼確認它真的有在擋?
想更進一步?
上面免費的三層已經能讓你動起來。如果你想要「照著做不迷路」甚至「我們幫你跑好」——往下看。
- 免費 這個坑是什麼、誰會踩
- 免費 人話解釋:錯在哪、正確的詞彙
- 免費 一段可直接貼給 AI 的 prompt
完整實作文件
未來新增- serverless 限流的正確架構(共享儲存 vs 平台級 WAF)完整選型
- 「看起來有防護、實際是空殼」的常見案例與檢查法
- 加上監控/告警,用證據證明限流真的在擋
可跑的 codebase / skill
未來新增- 現成的共享儲存限流範本(含連線失敗的安全 fallback)
- ✅ 跨實例一致 ✅ 冷啟動不失效 ✅ 掛掉不會拖垮整個端點
本文首發於 AI 許願池(https://kaowan.pages.dev/articles/my-rate-limit-doesnt-work/),發佈日 2026年7月5日。 轉載請註明出處——原創者不怕考古,只有小偷怕。🕳️