Express.js req.url Redirect Allowlist
A security-focused codemod that transforms Express.js route handlers using req.url in redirect calls to include URL allowlist validation, preventing open redirect vulnerabilities.
Security Context
This codemod addresses CWE-601: URL Redirection to Untrusted Site (Open Redirect), a critical security vulnerability where attackers can redirect users to malicious domains by crafting URLs that bypass basic validation.
References:
- CWE-601: URL Redirection to Untrusted Site
- OWASP Top 10 2021 - A03:2021 Injection
- Express.js Security Best Practices
Installation
bash
What it does
This codemod detects dangerous patterns where Express.js applications use req.url directly in res.redirect() calls and wraps them with URL allowlist validation.
Before
javascript
After
javascript
Features
- Detects vulnerable patterns: Finds direct usage of
req.urlin redirect calls - Variable tracking: Handles cases where
req.urlis assigned to variables first - Status code support: Works with both
res.redirect(url)andres.redirect(status, url)patterns - Skip logic: Avoids transforming files that already have validation functions
- Customizable allowlist: Provides a default allowlist that should be customized per application
Supported Patterns
✅ Transforms these patterns:
res.redirect(req.url)res.redirect(301, req.url)const url = req.url; res.redirect(url)- Arrow functions and function expressions
- Router methods (
router.get,router.post, etc.) - Middleware functions (
app.use)
❌ Skips these patterns:
- Static redirects like
res.redirect('/static/path') - Query parameter redirects like
res.redirect(req.query.returnUrl) - Files already containing
isValidRedirectUrlfunction - Non-Express code patterns
Configuration
After running the codemod, you must customize the allowedDomains array for your specific application:
javascript
File Support
- JavaScript (
.js,.mjs) - TypeScript (
.ts) - JSX/TSX (
.jsx,.tsx)
Excludes:
- Test files (
*.test.*,*.spec.*,__tests__/) - Node modules
- TypeScript declaration files (
*.d.ts)
Development
bash
License
MIT
Contributing
When contributing, ensure:
- All tests pass (
pnpm test) - New test cases cover edge cases
- Security implications are considered
- Documentation is updated