未放弃会话¶
ID: js/session-fixation
Kind: problem
Security severity: 5
Severity: warning
Precision: medium
Tags:
- security
- external/cwe/cwe-384
Query suites:
- javascript-security-extended.qls
- javascript-security-and-quality.qls
重复使用会话可能允许攻击者未经授权地访问另一个帐户。始终确保在用户登录或注销时放弃当前会话,以便可以启动新会话。
建议¶
始终使用`req.session.regenerate(...);` 在用户登录或注销时启动新会话。
示例¶
以下示例显示了在身份验证后使用先前会话。这将允许以前的用户使用新用户的帐户。
const express = require('express');
const session = require('express-session');
var bodyParser = require('body-parser')
const app = express();
app.use(bodyParser.urlencoded({ extended: false }))
app.use(session({
secret: 'keyboard cat'
}));
app.post('/login', function (req, res) {
// Check that username password matches
if (req.body.username === 'admin' && req.body.password === 'admin') {
req.session.authenticated = true;
res.redirect('/');
} else {
res.redirect('/login');
}
});
此代码示例通过不重复使用会话来解决此问题,而是调用`req.session.regenerate()` 来确保不会重复使用会话。
const express = require('express');
const session = require('express-session');
var bodyParser = require('body-parser')
const app = express();
app.use(bodyParser.urlencoded({ extended: false }))
app.use(session({
secret: 'keyboard cat'
}));
app.post('/login', function (req, res) {
// Check that username password matches
if (req.body.username === 'admin' && req.body.password === 'admin') {
req.session.regenerate(function (err) {
if (err) {
res.send('Error');
} else {
req.session.authenticated = true;
res.redirect('/');
}
});
} else {
res.redirect('/login');
}
});
参考资料¶
OWASP: 会话固定
Stack Overflow: 使用 Passport 在身份验证后创建新会话
jscrambler.com: Node 中安全会话管理的最佳实践
常见弱点枚举:CWE-384.