2012-05-25 49 views
1

我正在使用connect-mysql-session將會話存儲在數據庫中。現在我的問題是我如何添加包含瀏覽器代理和IP地址的用戶數據來檢查會話是否有效?我如何獲得這些信息?我如何檢查它是否匹配?Nodejs Expressjs會話IP和瀏覽器代理匹配

users.login(credentials,function(err, results) { 

    //On errors 
    if (err) { 
    res.render(routes.index, { 
     title: 'Login' 
    }); 

    //On success 
    } else if (results[0]) { 
    //Set session data and redirect to start page 
    req.session.userdata = results[0]; 
    req.session.userdata.email = req.body.email_login; 
    req.session.is_logged_in = true; 
    res.redirect('/start'); 

    //Wrong credentials 
    } else { 
    req.flash('warning','Wrong password or login'); 
    res.render('index', { 
     title: 'Login' 
    }); 
    } 
}); 

更新:

我現在得到這個添加到會話:

req.session.ip = req.connection.remoteAddress; 
req.session.useragent = req.headers['user-agent']; 

,並在我的AUTH中間件檢查它:

if(req.session.userdata && req.session.is_logged_in === true && req.session.ip === req.connection.remoteAddress && req.session.useragent === req.headers['user-agent']) { 
    next(); 
    } else { 
    res.redirect('/'); 
    } 

這是安全的或者你看到這有什麼風險?我應該以另一種方式去解決嗎?

回答

1

您的實施看起來不錯,並且會爲您提供一些非常基本的防範會話劫持的保護。

但是,我不確定我是否理解你的中間件。什麼阻止用戶直接請求/start?而且,更重要的是,由於中間件攔截了所有請求,即使是那些針對/start的應用程序,這看起來不像是一些無限重定向循環嗎?

我的建議只是考慮一個用戶在ip或用戶代理不匹配時一直登出的用戶。

+0

你是對的無限循環。我編輯了代碼,粘貼問題。 你有什麼建議可以使這個更安全的劫持方面。正如你所說這是非常基本的,但我真的不知道我還有什麼要保護?任何提示或提示表示讚賞。謝謝 – georgesamper

+0

頁面通過https傳輸。 – georgesamper

+0

通過HTTPS傳輸頁面,您絕對可以輕鬆前往,而且您對此有很強的保護。這絕對是缺少的信息。我會做的唯一的額外建議是在會話cookie中設置'secure'標誌,所以它只能通過HTTPS連接傳輸。這將防止用戶錯誤地請求非安全頁面清楚地公開會話cookie。 – Pierre