Patch IP recognition

This commit is contained in:
Tuan Dang
2023-01-17 00:50:35 +07:00
parent 56aec216c1
commit 614a2558f5
5 changed files with 29 additions and 4 deletions
+11
View File
@@ -36,6 +36,7 @@
"nodemailer": "^6.8.0", "nodemailer": "^6.8.0",
"posthog-node": "^2.2.2", "posthog-node": "^2.2.2",
"query-string": "^7.1.3", "query-string": "^7.1.3",
"request-ip": "^3.3.0",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"stripe": "^10.7.0", "stripe": "^10.7.0",
"swagger-autogen": "^2.22.0", "swagger-autogen": "^2.22.0",
@@ -10516,6 +10517,11 @@
"url": "https://github.com/sponsors/mysticatea" "url": "https://github.com/sponsors/mysticatea"
} }
}, },
"node_modules/request-ip": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz",
"integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA=="
},
"node_modules/require-directory": { "node_modules/require-directory": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
@@ -19972,6 +19978,11 @@
"integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==",
"dev": true "dev": true
}, },
"request-ip": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/request-ip/-/request-ip-3.3.0.tgz",
"integrity": "sha512-cA6Xh6e0fDBBBwH77SLJaJPBmD3nWVAcF9/XAcsrIHdjhFzFiB5aNQFytdjCGPezU3ROwrR11IddKAM08vohxA=="
},
"require-directory": { "require-directory": {
"version": "2.1.1", "version": "2.1.1",
"resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+1
View File
@@ -102,6 +102,7 @@
"nodemailer": "^6.8.0", "nodemailer": "^6.8.0",
"posthog-node": "^2.2.2", "posthog-node": "^2.2.2",
"query-string": "^7.1.3", "query-string": "^7.1.3",
"request-ip": "^3.3.0",
"rimraf": "^3.0.2", "rimraf": "^3.0.2",
"stripe": "^10.7.0", "stripe": "^10.7.0",
"swagger-autogen": "^2.22.0", "swagger-autogen": "^2.22.0",
+5 -2
View File
@@ -8,8 +8,9 @@ import cookieParser from 'cookie-parser';
import dotenv from 'dotenv'; import dotenv from 'dotenv';
import swaggerUi = require('swagger-ui-express'); import swaggerUi = require('swagger-ui-express');
// eslint-disable-next-line @typescript-eslint/no-var-requires // eslint-disable-next-line @typescript-eslint/no-var-requires
const swaggerFile = require('../spec.json') const swaggerFile = require('../spec.json');
// eslint-disable-next-line @typescript-eslint/no-var-requires
const requestIp = require('request-ip');
dotenv.config(); dotenv.config();
import { PORT, NODE_ENV, SITE_URL } from './config'; import { PORT, NODE_ENV, SITE_URL } from './config';
@@ -72,6 +73,8 @@ app.use(
}) })
); );
app.use(requestIp.mw())
if (NODE_ENV === 'production') { if (NODE_ENV === 'production') {
// enable app-wide rate-limiting + helmet security // enable app-wide rate-limiting + helmet security
// in production // in production
+11 -2
View File
@@ -8,6 +8,9 @@ const apiLimiter = rateLimit({
legacyHeaders: false, legacyHeaders: false,
skip: (request) => { skip: (request) => {
return request.path === '/healthcheck' || request.path === '/api/status' return request.path === '/healthcheck' || request.path === '/api/status'
},
keyGenerator: (req, res) => {
return req.clientIp
} }
}); });
@@ -16,7 +19,10 @@ const authLimiter = rateLimit({
windowMs: 60 * 1000, windowMs: 60 * 1000,
max: 10, max: 10,
standardHeaders: true, standardHeaders: true,
legacyHeaders: false legacyHeaders: false,
keyGenerator: (req, res) => {
return req.clientIp
}
}); });
// 10 requests per hour // 10 requests per hour
@@ -24,7 +30,10 @@ const passwordLimiter = rateLimit({
windowMs: 60 * 60 * 1000, windowMs: 60 * 60 * 1000,
max: 10, max: 10,
standardHeaders: true, standardHeaders: true,
legacyHeaders: false legacyHeaders: false,
keyGenerator: (req, res) => {
return req.clientIp
}
}); });
export { export {
+1
View File
@@ -5,6 +5,7 @@ import { ISecret } from '../../models';
declare global { declare global {
namespace Express { namespace Express {
interface Request { interface Request {
clientIp: any;
user: any; user: any;
workspace: any; workspace: any;
membership: any; membership: any;