区分大小写的中间件路径¶
ID: js/case-sensitive-middleware-path
Kind: problem
Security severity: 7.3
Severity: warning
Precision: high
Tags:
- security
- external/cwe/cwe-178
Query suites:
- javascript-code-scanning.qls
- javascript-security-extended.qls
- javascript-security-and-quality.qls
在中间件路由中使用区分大小写的正则表达式路径,攻击者可以在访问具有不区分大小写路径的端点时绕过该中间件。使用字符串指定的路径是不区分大小写的,而正则表达式默认情况下是区分大小写的。
建议¶
使用正则表达式作为中间件路径时,请确保正则表达式是不区分大小写的,方法是在正则表达式中添加 i
标志。
示例¶
以下示例将 /admin
路径中的路径访问限制为登录为管理员的用户
const app = require('express')();
app.use(/\/admin\/.*/, (req, res, next) => {
if (!req.user.isAdmin) {
res.status(401).send('Unauthorized');
} else {
next();
}
});
app.get('/admin/users/:id', (req, res) => {
res.send(app.database.users[req.params.id]);
});
例如 /admin/users/45
这样的路径只能由管理员访问。但是,路径 /ADMIN/USERS/45
可以被任何人访问,因为大写路径与区分大小写的正则表达式不匹配,而 Express 认为它与路径字符串 /admin/users
匹配。
可以通过在正则表达式中添加 i
标志来解决此问题
const app = require('express')();
app.use(/\/admin\/.*/i, (req, res, next) => {
if (!req.user.isAdmin) {
res.status(401).send('Unauthorized');
} else {
next();
}
});
app.get('/admin/users/:id', (req, res) => {
res.send(app.database.users[req.params.id]);
});