功能都齊了,今天處理安全:避免有人用程式一直猜密碼,並補上標準的安全標頭。
今天做的事
安裝helmet和express-rate-limit,對登入、註冊API設定 15 分鐘內同一個IP最多10次:
const authLimiter = rateLimit({
windowMs: 15 * 60 * 1000,
limit: 10,
standardHeaders: 'draft-7',
legacyHeaders: false,
message: { message: '嘗試次數過多,請 15 分鐘後再試' }
});
app.use('/api/auth', authLimiter, authRouter);
觀察
卡關
限流寫好了,連續登入失敗11次卻一直沒被擋下。檢查server.js 才發現,同一個路徑 /api/auth 被掛載了兩次:第一次是舊的、沒有限流,請求先碰到它就被處理掉,下面有限流的那一行永遠走不到。這跟第三天的路由重複是同一個教訓:Express是先寫的先贏,設定寫了不代表有生效。
心得
安全設定最容易出現的狀況是 以為有做。今天靠著故意測試、故意失敗11次,才發現限流根本沒生效。