Node / commonJS可以在请求之间“私有”变量泄漏

时间:2015-09-11 03:18:54

标签: javascript node.js commonjs koa

在虚构的Session模块中,_sessData变量可以在请求之间泄露。例如,可能是刚登录的用户,并且在“同一时间”调用的isAuthed()是针对不同的用户。这可能是个问题吗?每个请求都会调用此模块,所以我猜它是安全的,但确认会很好。

module.exports = function(app) {
    var _sessData = null;

    function Session() {
        //
    }

    Session.prototype.set = function( payload ) {
        Cookies.set('session', payload);
        _sessData = payload;
    }

    Session.prototype.isAuthed = function() {
        return _sessData && Object.keys(_sessData).length > 0;
    }

    Session.prototype.clear = function() {
        Cookies.set('session', '');
        _sessData = {};
    }

    Object.defineProperty(app.context, 'Session', {
        // Not exaclty sure what is happening here with this and _ctx..
        // Note: apprently ctx is bound to the middleware when call()ing
        get: function() { return new Session(this); }
    });

    return function * (next) {
        var token = Cookies.get('jwt');
        if ( ! token ) {
            _sessData = {};
            return yield* next;
        }

        try {
            _sessData = jwt.verify(token, SECRET);
        } catch(e) {
            if (e.name === 'TokenExpiredError') {
                this.Session.clear();
            }
        }
        yield* next;
    }

}

修改

该模块在KoaJS应用程序中得到了如此使用(上面的模块没有生成合适的KoaJS中间件,但这不是重点):

var app = require('koa')();

// JWT session middleware
var session = require("./session")();
app.use(session);

app.listen(3080);

1 个答案:

答案 0 :(得分:0)

导出的内容是一个函数,因此导入模块时实际上不存在_sessData。它在您调用函数时创建。每次调用该函数时 - 每个请求都需要调用一次 - 创建一个名为_sessData的范围内的新变量。不,他们不能互相干扰。