会话劫持安全性

时间:2012-03-04 21:12:15

标签: php security session

所以我有几种不同的方法可以尝试阻止会话劫持,一种方法使用HTTP_USER_AGENT并检测它是否在会话期间发生了变化。问题是,如果用户通过手机访问网站,并从移动视图更改为桌面视图,则用户代理会更改,并且用户会收到以下错误:

if (isset($_SESSION['HTTP_USER_AGENT']))
{
    if ($_SESSION['HTTP_USER_AGENT'] != md5($_SERVER['HTTP_USER_AGENT']))
    {
        echo "Error: security issue #1 (Please use contact us if recieving this error)";
        exit;
    }
}
else
{
    $_SESSION['HTTP_USER_AGENT'] = md5($_SERVER['HTTP_USER_AGENT']);
}

现在我仍然想要这个小小的安全层,但我不希望出现错误消息,并且我希望该网站对用户保持可见。我该怎么做?

3 个答案:

答案 0 :(得分:1)

用户在切换设备时需要重新进行身份验证(而不是导致错误),然后您可以使用经过身份验证的$_SESSION['HTTP_USER_AGENT']变量来比较将来的请求。

答案 1 :(得分:1)

要劫持会话,您需要知道其ID。您可以通过猜测有效的会话ID或从客户端或服务器获取它来执行此操作。

前者很容易减轻:熵越多越好。但是后者不能仅通过一个度量来缓解,因为会话ID可以通过多种方式公开/获得:

  • 窃听客户端和服务器之间的通信
  • 通过URL(HTTP引用,日志文件等)传输时泄露
  • 跨站点脚本(XSS)

其中一些可以很容易修复:使用安全通道(即HTTPS)可以避免窃听,并且可以通过在cookie中传输会话ID来避免通过URL泄漏(同时 HttpOnly 安全标志)。防止XSS是最难的,因为在将每个用户发起的输入数据返回给客户端之前必须处理它们。

但是如果你这样做,你就可以很好地防止会话劫持。至少您可以作为攻击者控制的部分可以直接从浏览器的cookie jar获取cookie。但这超出了你的范围。

答案 2 :(得分:0)

问题背后的前提反映了一种误解。

用户代理不是阻止会话劫持的有效方法。任何值得他们的盐的攻击者都可以轻易地欺骗他们的用户代理以匹配被劫持用户的用户代理。通过默默无闻,这种防御充其量是安全的。

防止会话劫持的正确方法是使用适当的安全实践,例如安全会话管理,站点SSL,CSRF保护,正确的输入验证和输出转义,防止XSS等。 OWASP在保护Web应用程序方面拥有一些优秀的资源。