用户控制的安全检查绕过¶
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
在权限检查中使用用户控制的数据可能会允许用户获得对受保护功能或数据的未经授权的访问。
建议¶
在检查用户是否对特定活动有授权时,不要在权限检查中使用完全由该用户控制的数据。如有必要,始终验证输入,理想情况下,应针对预期的固定值列表进行验证。
同样,不要根据用户数据决定要检查的权限。特别是,避免使用计算来决定要检查的权限。对特定操作使用固定权限,而不是生成要检查的权限。
示例¶
在本例中,我们有一个服务器,根据请求参数 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
}
});