CodeQL 文档

用户控制的安全检查绕过

ID: js/user-controlled-bypass
Kind: path-problem
Security severity: 7.8
Severity: error
Precision: medium
Tags:
   - security
   - external/cwe/cwe-807
   - external/cwe/cwe-290
Query suites:
   - javascript-security-extended.qls
   - javascript-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

在权限检查中使用用户控制的数据可能会允许用户获得对受保护功能或数据的未经授权的访问。

建议

在检查用户是否对特定活动有授权时,不要在权限检查中使用完全由该用户控制的数据。如有必要,始终验证输入,理想情况下,应针对预期的固定值列表进行验证。

同样,不要根据用户数据决定要检查的权限。特别是,避免使用计算来决定要检查的权限。对特定操作使用固定权限,而不是生成要检查的权限。

示例

在本例中,我们有一个服务器,根据请求参数 userId 显示用户的私有信息。出于隐私原因,用户只能查看自己的私有信息,因此服务器检查请求参数 userId 是否与登录用户的 Cookie 值匹配。

var express = require('express');
var app = express();
// ...
app.get('/full-profile/:userId', function(req, res) {

    if (req.cookies.loggedInUserId !== req.params.userId) {
        // BAD: login decision made based on user controlled data
        requireLogin();
    } else {
        // ... show private information
    }

});

但是,此安全检查还不够,因为攻击者可以制作自己的 Cookie 值以匹配任何用户的 Cookie 值。为了防止这种情况,服务器可以对安全关键的 Cookie 值进行密码学签名

var express = require('express');
var app = express();
// ...
app.get('/full-profile/:userId', function(req, res) {

    if (req.signedCookies.loggedInUserId !== req.params.userId) {
        // GOOD: login decision made based on server controlled data
        requireLogin();
    } else {
        // ... show private information
    }

});

参考资料

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