CodeQL 文档

未放弃会话

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

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

重复使用会话可能允许攻击者未经授权地访问另一个帐户。始终确保在用户登录或注销时放弃当前会话,以便可以启动新会话。

建议

始终使用`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');
    }
});

参考资料

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