express-rate-limit とは?
同一IPからのリクエスト回数を制限でき、制限回数を超えると、そのIPからのアクセスを一定時間ブロックできます。
ログインフォームなどへの連続アクセスを遅らせて、総当たり攻撃(ブルートフォース)をしづらくできます。
インストールするには、以下のコマンドを実行します。
npm install express-rate-limit ルーターで制限をかける設定
ルーターで制限をかけるには、ルーターに以下のように設定します。
const rateLimit = require('express-rate-limit');
const loginLimiter = rateLimit({
windowMs: 60 * 1000,
max: 5,
handler: (req, res, next, options) => {
res.redirect('/too_many_requests');
}
});
router.post('/login', loginLimiter, (req, res) => {
// 処理
}); ミドルウェア内で条件分岐して除外する
const rateLimit = require('express-rate-limit');
const limiter = rateLimit({
windowMs: 60 * 1000,
max: 5,
handler: (req, res, next, options) => {
res.redirect('/too_many_requests');
}
});
app.use((req, res, next) => {
const skipPaths = ['/too_many_requests'];
if (skipPaths.includes(req.path)) {
return next(); // 除外して次へ
}
return limiter(req, res, next); // それ以外は制限を適用
}); 送信テスト
Powershell で以下のコマンドを実行することで get メソッドで送信するには、以下のようにします。
for ($i = 1; $i -le 10; $i++) {
curl http://localhost:3000
Write-Host ""
} Powershell で POST メソッドで送信するには以下のようにします。
for ($i = 1; $i -le 10; $i++) {
Invoke-WebRequest -Uri http://localhost:3000/auth/login -Method POST
}