2011-08-26 151 views
0

这是我当前的会话管理:使用只有第3个部分IP地址的会话管理和安全

if(!isset($_SESSION["user"]["authenticated"]) || 
    !$_SESSION["user"]["authenticated"]) 
    redirect("login.php"); 

if($_SESSION["user"]["browserHash"] != md5($_SERVER["HTTP_USER_AGENT"])) 
    redirect("logout.php?err=browser_mismatch"); 

if($_SESSION["user"]["IPHash"] != md5($_SERVER["REMOTE_ADDR"])) 
    redirect("logout.php?err=ip_mismatch"); 

if(!isset($_SESSION["user"]["nonce"]) || 
    $_SESSION["user"]["nonce"] == $_COOKIE["SITE_nonce"]) 
{ 
    $nonce = md5(mt_rand() . time() . $_SERVER["REMOTE_ADDR"]); 
    $_SESSION["user"]["nonce"] = $nonce; 
    setcookie("SITE_nonce", $nonce, (60 * 15), "/path"); 
} 
else 
    redirect("logout.php?err=nonce_mismatch"); 

我知道改变IP问题的计划。但我担心的是攻击者能够嗅探标题等。那么我不会受到保护吧?如果我是受害者网络中的攻击者,我只需在嗅探一个响应标头后立即发出一个快速GET请求,然后我将得到重新生成的随机数。有没有真正的方法来防止这种情况?

如果不会太多,我也希望能够洞悉我的方法。这怎么能被规避?我错过了什么大事?

+2

如果您使用的是SSL,那么您已脱身。如果没有,总有办法来嗅探登录凭据,会话cookie或正常的cookie并使用它们伪造身份。你可以做的是在数据库中存储尽可能多的信息,并在每次请求完成时检查它们。这可能包括浏览器,操作系统等。由于cookie与通常安装在一台PC上的浏览器绑定,因此您会识别更改并可能作出相应的反应。 – Sgoettschkes

回答

0

如果用户在服务器端更新nonce后,但在用户收到新cookie之前发出新请求,则重新创建nonce的方法将失败。

例如,如果用户在失败的页面加载后点击F5或者他们在新窗口/选项卡中打开了大量链接,则会发生这种情况。

放弃IP检查的想法。由于多种原因,IP地址可能会完全更改。例如,考虑负载均衡代理或移动用户切换漫游区域。

可以检测到用户代理更改,并且您可以要求输入密码,但让他们重新登录(并重新启动他们在哪里执行的操作)并不是非常方便用户。

总而言之,您试图通过基于cookie值的会话来防止会话被窃取。您需要使用SSL,所有其他选项在安全性方面做得很少。基于cookie的会话令牌是目前接受的用于管理会话的方法,并且认为足够安全。

此外,CSRF攻击比会话劫持攻击更为危险,并且您不会用您的建议阻止这些攻击。所以我的建议是:首先关注这个领域。

+0

我明白了。我从来没有想过这种情况!我真的希望除SSL之外还有另一种实现会话劫持预防的方法,因为我发现即使是“大”站点在他们的所有页面中都不使用SSL。我已经在阅读CSRF,我想我必须重做我的链接和表单,以包含“交易令牌或非交易”以及非常重要的交易来请求重新验证。我从来没有想过保护这些可以这么辛苦!谢谢 –

0

为防止嗅探标头,您需要通过SSL/TLS保护连接。