0

这是我当前的会话管理:

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 问题的计划仅使用 IP 地址的前 3 部分。但我担心的是攻击者能够嗅探标头等。那我就不会被保护了吧?如果我是受害者网络中的攻击者,我只需在嗅探一个响应标头后发出一个快速 GET 请求,我将获得重新生成的随机数。真的有办法防止这种情况吗?

如果它不会太多,我也希望对我的方法有所了解。如何避免这种情况?我错过了什么大事吗?

4

2 回答 2

0

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

于 2011-08-26T07:51:23.027 回答
0

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

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

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

可以检测到用户代理更改,您可以要求他们输入密码,但是让他们重新登录(并重新启动他们在哪里做的事情)对用户来说不是很友好。

总而言之,您正在尝试使用基于 cookie 值的会话来保护您的系统免受会话窃取。为此,您需要 SSL,所有其他选项在安全性方面作用不大。基于 cookie 的会话令牌是当前公认的用于管理会话的方法,并且被认为足够安全。

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

于 2011-08-26T11:35:51.110 回答