会话劫持护照

时间:2014-03-22 13:39:45

标签: node.js express passport.js

想知道如何使用护照js防止会话劫持,目前如果我将cookie复制并粘贴到另一个浏览器中,我可以访问所有内容。

2 个答案:

答案 0 :(得分:9)

会话劫持是一种攻击,在这种情况下,通过窃取会话cookie(或一般的会话ID)来工作。将cookie复制/粘贴到另一个客户端确实会窃取会话,这就是它应该如何工作。

防止会话劫持的目的是确保cookie不会被中间人拦截,实现此目的的最佳方法是使用HTTPS / SSL。 此外,您应该刷新会话ID(例如使用“session.regenerate”):这使得攻击者很难窃取会话ID并在用户获得新会话之前使用它。

除了这些基本的东西,你几乎什么也做不了。保护cookie应该是客户的任务,而不是您的应用程序。

顺便说一下,不要尝试将会话链接到用户IP,因为这对于从多个IP连接的用户来说是非常令人沮丧的(在公司,大学等中很常见)。在我看来,唯一没有很多“副作用”的是将会话链接到浏览器的用户代理。虽然攻击者可以很容易地欺骗它,但它仍然提供了更多的保护 - 有些东西比什么都好。

答案 1 :(得分:1)

我没有使用护照,但基本上有3种主要方法可以保护cookie不被劫持:

  1. HTTPS / SSL :这可以防止网络窥探者简单地从网络中挑选Cookie。 Cloudflare允许您在自己的网站上免费使用SSL。本月的第一个1GB是免费的,之后他们只收取每GB 1美分。 Heroku还提供免费SSL,但您必须支付约10美元的月费。
  2. 加密/签名Cookie :这可以防止用户修改您的Cookie。 Express cookie解析器能够对cookie进行签名,但不对其进行加密。我不是一个明确的专家,但基本上你需要一些实现Secure cookie protocol的东西。您可能必须为此实现自己的代码。
  3. 浏览器验证:这是您的主要问题。如果有人将cookie复制并粘贴到另一个浏览器中会发生什么。您可以在cookie中存储各种指纹信息(即浏览器|浏览器主要版本|处理器| ISP |等),如果存在未匹配,则拒绝cookie。例如,如果国家/地区不同,则应拒绝会话。
  4. 示例:

    function validate(req, session) {
        if ( 
          getISP(req) !== session.isp ||
          getSimplifiedUA(req) !== session.ua ||
          // More tests...
        )
            return false
    
        return true;
    }
    
    app.use(function(req, res, next) {
        if( req.session && !validate(req, req.session) ) {
            return req.session.regenerate(function(err) {
                if ( err ) return next(err);
                req.session.isp = getISP(req);
                req.session.ua = getSimplifiedUA(req);
                next();
            });
        }
    
        next();
    });
    
    app.use('/', function(req, res, next) {
        // Render something...
    });