Skip to content
This repository was archived by the owner on Apr 19, 2023. It is now read-only.

Commit d5a40ef

Browse files
✨ Add brute force prevention
1 parent 3c8e1d5 commit d5a40ef

File tree

5 files changed

+49
-3
lines changed

5 files changed

+49
-3
lines changed

package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
"@types/cors": "^2.8.5",
3838
"@types/dotenv": "^6.1.1",
3939
"@types/express": "^4.16.1",
40+
"@types/express-brute": "^0.0.37",
4041
"@types/fs-extra": "^7.0.0",
4142
"@types/geolite2": "^1.2.0",
4243
"@types/hapi__joi": "^15.0.1",
@@ -76,6 +77,7 @@
7677
"crypto-random-string": "^3.0.0",
7778
"express": "^4.17.0",
7879
"express-async-handler": "^1.1.4",
80+
"express-brute": "^1.0.1",
7981
"fs-extra": "^8.0.1",
8082
"geolite2": "^1.2.1",
8183
"googleapis": "^40.0.0",

src/config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,12 @@ config();
44
// Server
55
export const PORT = process.env.PORT ? parseInt(process.env.PORT) : 7007;
66
export const SENTRY_DSN = process.env.SENTRY_DSN || "";
7+
export const BRUTE_FREE_RETRIES = process.env.BRUTE_FREE_RETRIES
8+
? parseInt(process.env.BRUTE_FREE_RETRIES)
9+
: 10;
10+
export const BRUTE_LIFETIME = process.env.BRUTE_LIFETIME
11+
? parseInt(process.env.BRUTE_LIFETIME)
12+
: 300000;
713

814
// Database
915
export const DB_HOST = process.env.DB_HOST || "localhost";

src/controllers/auth.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,20 +19,21 @@ import {
1919
Post,
2020
Controller,
2121
Middleware,
22-
ClassWrapper
22+
ClassWrapper,
23+
ClassMiddleware
2324
} from "@overnightjs/core";
24-
import { authHandler } from "../helpers/middleware";
25+
import { authHandler, bruteForceHandler } from "../helpers/middleware";
2526
import { CREATED } from "http-status-codes";
2627
import asyncHandler from "express-async-handler";
2728
import { joiValidate } from "../helpers/utils";
2829
import Joi from "@hapi/joi";
2930

3031
@Controller("auth")
32+
@ClassMiddleware(bruteForceHandler)
3133
@ClassWrapper(asyncHandler)
3234
export class AuthController {
3335
@Post("register")
3436
async register(req: Request, res: Response) {
35-
const name = req.body.name;
3637
const email = req.body.email;
3738
joiValidate(
3839
{

src/helpers/middleware.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,14 @@
11
import { Request, Response, NextFunction } from "express";
2+
import Brute from "express-brute";
23
import { safeError } from "./errors";
34
import { verifyToken } from "./jwt";
45
import { ErrorCode, Tokens } from "../interfaces/enum";
6+
import { BRUTE_LIFETIME, BRUTE_FREE_RETRIES } from "../config";
7+
const store = new Brute.MemoryStore();
8+
const bruteForce = new Brute(store, {
9+
freeRetries: BRUTE_FREE_RETRIES,
10+
lifetime: BRUTE_LIFETIME
11+
});
512

613
/**
714
* Handle any errors for Express
@@ -63,3 +70,8 @@ export const authHandler = async (
6370
return res.json(error);
6471
}
6572
};
73+
74+
/**
75+
* Brute force middleware
76+
*/
77+
export const bruteForceHandler = bruteForce.prevent;

yarn.lock

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,13 @@
11061106
resolved "https://registry.yarnpkg.com/@types/events/-/events-3.0.0.tgz#2862f3f58a9a7f7c3e78d79f130dd4d71c25c2a7"
11071107
integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==
11081108

1109+
"@types/express-brute@^0.0.37":
1110+
version "0.0.37"
1111+
resolved "https://registry.yarnpkg.com/@types/express-brute/-/express-brute-0.0.37.tgz#0660dd3010dfe33e0dbf2bc971a48dd1d9c366f2"
1112+
integrity sha512-N1eDsPeRadiaLLfcCOxtQWSNN7ipdrg7IvRZNzQaUTvVvfGYwu8eZHOBbRrYb632jooc2Mmzz+TovBm+44itFA==
1113+
dependencies:
1114+
"@types/express" "*"
1115+
11091116
"@types/express-serve-static-core@*":
11101117
version "4.16.2"
11111118
resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.16.2.tgz#5ee8a22e602005be6767df6b2cba9879df3f75aa"
@@ -2590,6 +2597,14 @@ express-async-handler@^1.1.4:
25902597
resolved "https://registry.yarnpkg.com/express-async-handler/-/express-async-handler-1.1.4.tgz#225a84908df63b35ae9df94b6f0f1af061266426"
25912598
integrity sha512-HdmbVF4V4w1q/iz++RV7bUxIeepTukWewiJGkoCKQMtvPF11MLTa7It9PRc/reysXXZSEyD4Pthchju+IUbMiQ==
25922599

2600+
express-brute@^1.0.1:
2601+
version "1.0.1"
2602+
resolved "https://registry.yarnpkg.com/express-brute/-/express-brute-1.0.1.tgz#9f36d107fe34e40a682593e39bffcc53102b5335"
2603+
integrity sha1-nzbRB/405ApoJZPjm//MUxArUzU=
2604+
dependencies:
2605+
long-timeout "~0.1.1"
2606+
underscore "~1.8.3"
2607+
25932608
express@^4.16.3, express@^4.17.0:
25942609
version "4.17.1"
25952610
resolved "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz#4491fc38605cf51f8629d39c2b5d026f98a4c134"
@@ -4286,6 +4301,11 @@ log-driver@^1.2.7:
42864301
resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.7.tgz#63b95021f0702fedfa2c9bb0a24e7797d71871d8"
42874302
integrity sha512-U7KCmLdqsGHBLeWqYlFA0V0Sl6P08EE1ZrmA9cxjUE0WVqT9qnyVDPz1kzpFEP0jdJuFnasWIfSd7fsaNXkpbg==
42884303

4304+
long-timeout@~0.1.1:
4305+
version "0.1.1"
4306+
resolved "https://registry.yarnpkg.com/long-timeout/-/long-timeout-0.1.1.tgz#9721d788b47e0bcb5a24c2e2bee1a0da55dab514"
4307+
integrity sha1-lyHXiLR+C8taJMLivuGg2lXatRQ=
4308+
42894309
loose-envify@^1.0.0:
42904310
version "1.4.0"
42914311
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@@ -6238,6 +6258,11 @@ undefsafe@^2.0.2:
62386258
dependencies:
62396259
debug "^2.2.0"
62406260

6261+
underscore@~1.8.3:
6262+
version "1.8.3"
6263+
resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.8.3.tgz#4f3fb53b106e6097fcf9cb4109f2a5e9bdfa5022"
6264+
integrity sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=
6265+
62416266
unicode-canonical-property-names-ecmascript@^1.0.4:
62426267
version "1.0.4"
62436268
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"

0 commit comments

Comments
 (0)