请教Express 中的 session 和 cookie 的安全问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请教Express 中的 session 和 cookie 的安全问题相关的知识,希望对你有一定的参考价值。

Session 并不是最佳的验证用户的方案,性能偏低(虽然小应用无所谓啦),我使用的方法是

在 Cookie 中将一个数组变成 JSON 加密存储到 Cookie 中,数组中存一些常用的资料,比如 用户名,uid,email 等等

在访问每一个页面的时候解密这个 Cookie,得到每一个页面都需要用到的资料,避免了一次数据库查询。
参考技术A Session 并不是最佳的验证用户的方案,性能偏低(虽然小应用无所谓啦),我使用的方法是

在 Cookie 中将一个数组变成 JSON 加密存储到 Cookie 中,数组中存一些常用的资料,比如 用户名,uid,email 等等

在访问每一个页面的时候解密这个 Cookie,得到每一个页面都需要用到的资料,避免了一次数据库查询。
参考技术B Session 并不是最佳的验证用户的方案,性能偏低(虽然小应用无所谓啦),我使用的方法是 在 Cookie 中将一个数组变成 JSON 加密存储到 Cookie 中,数组中存一些常用的资料,比如 用户名,uid,email 等等 在访问每一个页面的时候解密这个 Cookie...

具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?

尝试使用Node.js和Express为我的个人项目工作。我正在使用MySQL数据库作为我的会话存储,并安装了以下模块:

  • 表达
  • body-parser,用于获取POST数据
  • mysql,连接到我的DB
  • 心中
  • 快递会话
  • 表达MySQL的会话
  • bcrypt,用于将POST数据与DB哈希进行比较

我正在通过javascript从页面发送包含登录信息的POST请求,我将其与数据库中的哈希进行比较。如果匹配,我为用户创建会话。我想阻止用户再次登录,如果它有一个会话,但看起来似乎没有存储会话cookie。我通过查看req.session来验证这一点,但我创建的user对象从未出现过。

正在创建数据库中的记录:如果我使用正确的数据登录,则会创建新记录。我不确定这是否应该发生但如果我再次使用同一用户登录它会创建一个新记录。

这是我得到的:

var express    = require('express');
var app        = express();
var bodyParser = require('body-parser');
var mysql      = require('mysql');
var cors       = require('cors');
var session    = require('express-session');
var MySQLStore = require('express-mysql-session')(session);
var bcrypt     = require('bcrypt');

var options = { ... };
var pool = mysql.createPool(options);
var sessionConnection = mysql.createConnection(options);

var sessionStore = new MySQLStore({
    expiration: 10800000,
    createDatabaseTable: true,
    schema: {
        tableName: 'USERS_SESSIONS',
        columnNames: {
            session_id: 'session_id',
            expires: 'expires',
            data: 'data'
        }
    }
}, sessionConnection);

// i'll change key & secret later
app.use(session({
    key: '69Atu22GZTSyDGW4sf4mMJdJ42436gAs',
    secret: '3dCE84rey8R8pHKrVRedgyEjhrqGT5Hz',
    store: sessionStore,
    resave: false,
    saveUninitialized: true
}));

app.use(cors());

...

var router = express.Router();

router.post('/login', function(req, res){
    if (req.session.user){
         console.log('already logged in');
    }else{
        // get connection from pool, retrieve user record
        // PLAIN is password from request, row.HASH is the record's hash
        bcrypt.compare(PLAIN, row.HASH, function(err, match){
            // do error handling
            // when match = true do this

            req.session.user = {
                id: row.ID,
                nickname: row.NICK,
                isAuthed: true
            };
            res.sendStatus(200); // else send 401
            return;
        });
    }
});

成功登录后,我会检查我的会话:

router.get('/session', function(req, res){
    res.json(req.session);
});

我得到以下内容:

{"cookie":{"originalMaxAge":null,"expires":null,"httpOnly":true,"path":"/"}}

正如你所看到的,没有user对象。我没有收到任何错误,我无法弄清问题在哪里。

答案
var cookieParser = require('cookie-parser');

请先添加app.use(cookieParser());

app.use(session({
    key: '69Atu22GZTSyDGW4sf4mMJdJ42436gAs',
    secret: '3dCE84rey8R8pHKrVRedgyEjhrqGT5Hz',
    store: sessionStore,
    resave: false,
    saveUninitialized: true
}));

有关详细文档https://www.npmjs.com/package/cookie-parser

以上是关于请教Express 中的 session 和 cookie 的安全问题的主要内容,如果未能解决你的问题,请参考以下文章

具有express-sessions和express-mysql-session的NodeJS没有设置会话。我搞砸了哪里?

express-session整理

Express 会话与 PassportJS 会话

express-session 和 cookie-session 有啥区别?

Apollo-server-express Session 未定义问题

express4+mysql博客项目