CodeQL 文档

从 GET 请求中读取敏感数据

ID: js/sensitive-get-query
Kind: problem
Security severity: 6.5
Severity: warning
Precision: high
Tags:
   - security
   - external/cwe/cwe-598
Query suites:
   - javascript-code-scanning.qls
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

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

诸如用户密码之类的敏感信息不应在请求 URL 的查询字符串中传输。URL 中的敏感信息可能会记录在各种位置,包括用户的浏览器、Web 服务器以及两个端点之间的任何转发或反向代理服务器。URL 也可能在屏幕上显示,并由用户保存书签或通过电子邮件发送。当用户访问任何非站点链接时,它们可能会通过 Referer 标头向第三方公开。因此,将敏感信息放入 URL 会增加攻击者捕获它的风险。

建议

使用 HTTP POST 将敏感信息作为请求正文的一部分发送;例如,作为表单数据。

示例

以下示例显示了两个路由处理程序,它们都接收用户名和密码。第一个从 GET 请求的查询参数中接收此敏感信息,该信息在 URL 中传输。第二个从 POST 请求的请求正文中接收此敏感信息。

const express = require('express');
const app = express();
app.use(require('body-parser').urlencoded({ extended: false }))

// bad: sensitive information is read from query parameters
app.get('/login1', (req, res) => {
    const user = req.query.user;
    const password = req.query.password;
    if (checkUser(user, password)) {
        res.send('Welcome');
    } else {
        res.send('Access denied');
    }
});

// good: sensitive information is read from post body
app.post('/login2', (req, res) => {
    const user = req.body.user;
    const password = req.body.password;
    if (checkUser(user, password)) {
        res.send('Welcome');
    } else {
        res.send('Access denied');
    }
});

参考资料

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