zexson_toolkit
Version:
Zexson Toolkit is a powerful encryption and tokenization library developed by Zexson Team. It offers proprietary encryption algorithms, high-security random token generation, and advanced object comparison features. It includes many advanced security func
84 lines (83 loc) • 3.21 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.csrfMiddleware = void 0;
const generator_1 = require("./generator");
let tokens = [];
/**
* CSRF (Cross-Site Request Forgery) protection middleware for Express applications.
* This middleware manages CSRF tokens for secure form submissions and API requests.
*
* The middleware adds three methods to the request object:
* - `isCsrf()`: Validates if the current request has a valid CSRF token
* - `createCsrf()`: Generates a new CSRF token and stores it
* - `deleteCsrf()`: Removes the current CSRF token
*
* Tokens are stored in memory and automatically expire after a set time period.
*
* @param {any} req - Express request object
* @param {any} res - Express response object
* @param {Function} next - Express next middleware function
*
* @example
* // In your Express app setup
* import { csrfMiddleware } from './middleware/csrf'
* app.use(csrfMiddleware)
*
* // In your route handler
* app.post('/form-submit', (req, res) => {
* // Verify CSRF token
* if (!req.isCsrf()) {
* return res.status(403).send('Invalid CSRF token')
* }
*
* // Process the request
* // ...
*
* // Generate a new token for the next request
* const newToken = req.createCsrf()
* res.cookie('csrfToken', newToken)
* res.send('Success')
* })
*
* @since 1.1.3
* @category Security
*/
const csrfMiddleware = (req, res, next) => {
const token = req.cookies.csrfToken, isCsrf = () => (typeof token == 'string' && token.length === 30) ? tokens.find(t => t.token === token && t.expiresAt > Date.now()) != undefined ? true : undefined : undefined, deleteCsrf = () => {
if (tokens.find(t => t.token === token)) {
tokens = tokens.filter(t => t.token != req.cookies.csrfToken);
return true;
}
return undefined;
}, createCsrf = (charSet = '1234567890qwertyuiopasdfghjklzxcvbnmQWERTYUIOPASDFGHJKLZXCVBNM') => {
let newToken = (0, generator_1.tokenGenerator)(30, charSet);
if (isCsrf()) {
console.log('delete csrf token:', token);
tokens = tokens.filter(t => t.token != token);
}
do
if (tokens.find(t => t.token === newToken) == undefined)
break;
else
newToken = (0, generator_1.tokenGenerator)(30, charSet);
while (true);
console.log('create csrf token:', newToken);
tokens.push({ token: newToken, expiresAt: Date.now() + /* 86400000 */ 10000 });
console.log(tokens, tokens.length);
return newToken;
};
req.isCsrf = isCsrf;
req.createCsrf = createCsrf;
req.deleteCsrf = deleteCsrf;
next();
};
exports.csrfMiddleware = csrfMiddleware;
// setInterval(() => tokens.forEach(t => t.expiresAt <= Date.now() ? tokens = tokens.filter(t => t.token != t.token) : undefined), 1000)
setInterval(() => {
tokens.forEach(t => {
if (t.expiresAt <= Date.now()) {
console.log('time is up:', t.token);
tokens = tokens.filter(t => t.token != t.token);
}
});
}, 1000);
;