api: upgrade express-rate-limit to v7, reuse key generator

This commit is contained in:
jj 2024-11-01 12:54:16 +00:00
parent 693204b799
commit d466f8a4af
No known key found for this signature in database
3 changed files with 20 additions and 18 deletions

View file

@ -31,7 +31,7 @@
"dotenv": "^16.0.1", "dotenv": "^16.0.1",
"esbuild": "^0.14.51", "esbuild": "^0.14.51",
"express": "^4.21.0", "express": "^4.21.0",
"express-rate-limit": "^6.3.0", "express-rate-limit": "^7.4.1",
"ffmpeg-static": "^5.1.0", "ffmpeg-static": "^5.1.0",
"hls-parser": "^0.10.7", "hls-parser": "^0.10.7",
"ipaddr.js": "2.2.0", "ipaddr.js": "2.2.0",

View file

@ -68,31 +68,33 @@ export const runAPI = (express, app, __dirname, isPrimary = true) => {
return res.status(status).json(body); return res.status(status).json(body);
}; };
const keyGenerator = (req) => hashHmac(getIP(req), 'rate').toString('base64url');
const sessionLimiter = rateLimit({ const sessionLimiter = rateLimit({
windowMs: 60000, windowMs: 60000,
max: 10, limit: 10,
standardHeaders: true, standardHeaders: 'draft-6',
legacyHeaders: false, legacyHeaders: false,
keyGenerator: req => hashHmac(getIP(req), 'rate'), keyGenerator,
handler: handleRateExceeded handler: handleRateExceeded
}); });
const apiLimiter = rateLimit({ const apiLimiter = rateLimit({
windowMs: env.rateLimitWindow * 1000, windowMs: env.rateLimitWindow * 1000,
max: (req) => req.rateLimitMax || env.rateLimitMax, limit: (req) => req.rateLimitMax || env.rateLimitMax,
standardHeaders: true, standardHeaders: 'draft-6',
legacyHeaders: false, legacyHeaders: false,
keyGenerator: req => req.rateLimitKey || hashHmac(getIP(req), 'rate'), keyGenerator: req => req.rateLimitKey || keyGenerator(req),
handler: handleRateExceeded handler: handleRateExceeded
}) })
const apiTunnelLimiter = rateLimit({ const apiTunnelLimiter = rateLimit({
windowMs: env.rateLimitWindow * 1000, windowMs: env.rateLimitWindow * 1000,
max: (req) => req.rateLimitMax || env.rateLimitMax, limit: (req) => req.rateLimitMax || env.rateLimitMax,
standardHeaders: true, standardHeaders: 'draft-6',
legacyHeaders: false, legacyHeaders: false,
keyGenerator: req => req.rateLimitKey || hashHmac(getIP(req), 'rate'), keyGenerator: req => req.rateLimitKey || keyGenerator(req),
handler: (req, res) => { handler: (_, res) => {
return res.sendStatus(429) return res.sendStatus(429)
} }
}) })

View file

@ -32,8 +32,8 @@ importers:
specifier: ^4.21.0 specifier: ^4.21.0
version: 4.21.0 version: 4.21.0
express-rate-limit: express-rate-limit:
specifier: ^6.3.0 specifier: ^7.4.1
version: 6.11.2(express@4.21.0) version: 7.4.1(express@4.21.0)
ffmpeg-static: ffmpeg-static:
specifier: ^5.1.0 specifier: ^5.1.0
version: 5.2.0 version: 5.2.0
@ -1298,11 +1298,11 @@ packages:
resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
engines: {node: '>=10'} engines: {node: '>=10'}
express-rate-limit@6.11.2: express-rate-limit@7.4.1:
resolution: {integrity: sha512-a7uwwfNTh1U60ssiIkuLFWHt4hAC5yxlLGU2VP0X4YNlyEDZAqF4tK3GD3NSitVBrCQmQ0++0uOyFOgC2y4DDw==} resolution: {integrity: sha512-KS3efpnpIDVIXopMc65EMbWbUht7qvTCdtCR2dD/IZmi9MIkopYESwyRqLgv8Pfu589+KqDqOdzJWW7AHoACeg==}
engines: {node: '>= 14'} engines: {node: '>= 16'}
peerDependencies: peerDependencies:
express: ^4 || ^5 express: 4 || 5 || ^5.0.0-beta.1
express@4.21.0: express@4.21.0:
resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==} resolution: {integrity: sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==}
@ -3341,7 +3341,7 @@ snapshots:
signal-exit: 3.0.7 signal-exit: 3.0.7
strip-final-newline: 2.0.0 strip-final-newline: 2.0.0
express-rate-limit@6.11.2(express@4.21.0): express-rate-limit@7.4.1(express@4.21.0):
dependencies: dependencies:
express: 4.21.0 express: 4.21.0