CodeQL 文档

区分大小写的中间件路径

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

单击查看 CodeQL 代码库中的查询

在中间件路由中使用区分大小写的正则表达式路径,攻击者可以在访问具有不区分大小写路径的端点时绕过该中间件。使用字符串指定的路径是不区分大小写的,而正则表达式默认情况下是区分大小写的。

建议

使用正则表达式作为中间件路径时,请确保正则表达式是不区分大小写的,方法是在正则表达式中添加 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]);
});

参考

  • ©GitHub, Inc.
  • 条款
  • 隐私