iT邦幫忙

0

Day 24 | 安全強化:登入限流與 helmet 安全標頭

  • 分享至 

  • xImage
  •  

功能都齊了,今天處理安全:避免有人用程式一直猜密碼,並補上標準的安全標頭。

今天做的事
安裝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);

觀察

  • 打開開發者工具看Response headers,多出了X-Content-Type-Options: nosniff、Strict-Transport-Security、Referrer-Policy等一整排之前沒有的標頭,都是helmet加的
  • 第三天看到的X-Powered-By: Express其實是在告訴外人我用什麼框架,helmet會把它移除
  • 為了讓頁面內直接寫的能執行,我把helmet的內容安全政策(CSP)關掉了。這是目前的取捨,更好的做法是把script拆成獨立檔案再開啟CSP
  • 限流的次數記在記憶體裡,重啟伺服器就歸零

卡關
限流寫好了,連續登入失敗11次卻一直沒被擋下。檢查server.js 才發現,同一個路徑 /api/auth 被掛載了兩次:第一次是舊的、沒有限流,請求先碰到它就被處理掉,下面有限流的那一行永遠走不到。這跟第三天的路由重複是同一個教訓:Express是先寫的先贏,設定寫了不代表有生效。

心得
安全設定最容易出現的狀況是 以為有做。今天靠著故意測試、故意失敗11次,才發現限流根本沒生效。


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言