2

我正在对 StackOverflow 进行一些关于如何正确设置会话和防止劫持等的研究。我找到了有人在其中一个问题上发布的答案,他提供了以下代码:

当用户登录并且用户名和密码匹配时

$_SESSION['fingerprint'] = md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR']);

检查用户是否已登录,对于受保护的页面:

if ($_SESSION['fingerprint'] != md5($_SERVER['HTTP_USER_AGENT'] .''. $_SERVER['REMOTE_ADDR'])) {       
        session_destroy();
        header('Location: login.php');
        exit();     
    }

它似乎工作正常,但我的问题是:这有多安全,这是一个好方法还是我应该尝试其他方法?该帖子没有投票或任何内容,因此不确定它是否好。

另外,不确定如何通过此会话获取有关用户的信息。我需要在数据库中存储任何内容吗?

谢谢!

4

3 回答 3

3

这段代码有两个主要问题。

1) IP 地址因正当理由而改变。如果客户端位于负载均衡器后面,例如在公司网络中,那么他将无法使用您的 Web 应用程序。

2) 检查用户代理很像有一个 get 变量?is_hacker=false。如果黑客有会话 id,他就有了用户代理和它的欺骗手段。

此外,当进行纯文本比较实际上更安全时,我不知道为什么要为此使用 md5。因为首先是用户代理,所以攻击者可以使用 md5 前缀攻击来产生冲突,从而绕过 REMOTE_ADDR 检查。(有用的 md5 碰撞攻击不会经常出现,但这个很有趣!)

即使有了这个检查,CSRF 和 XSS 仍然可以用来影响会话。XSS 可用于读取 CSRF 令牌,然后使用 XHR 发出攻击者想要的任何请求。有人可能会认为这是试图减轻OWASP a9的影响,但实际上您需要使用 SSL 来保护会话 ID。

于 2011-08-21T17:32:31.417 回答
0

我同意 Rook 的评论,这是对您的代码的很好的分析。

保护 PHP 会话需要考虑很多因素,但是使用最新版本的 PHP 并不难实现,需要考虑一些事情: - 会话文件存储在服务器上的位置(如果它是共享服务器,则主要是一个问题) -对客户端和服务器之间的所有敏感数据和 cookie 使用安全连接 - 尽你所能确保客户端上的 cookie 会话 ID 安全 - 不在会话变量中存储任何敏感数据

至于将东西存储在数据库中,这取决于您的需要,但我会说您可能不需要它,并且将数据存储在会话变量中对于安全性很好,只是(正如我已经说过的)不要存储任何东西那里很敏感。从另一个位置检索敏感数据,很可能是数据库。

如果您需要了解更多关于PHP 会话安全的信息,我有一系列关于该主题的博客文章

于 2013-01-14T15:17:17.923 回答
0

这看起来是个不错的方法,但是指纹哈希是由客户端数据生成的,可以被欺骗。用于登录表单的一个好方法是生成一个随机令牌,该令牌存储在会话中并通过表单传递。一旦令牌被验证(或不被验证),它应该被取消设置为一次性使用。

用户登录后,会话还应存储用户 ID,以检索存储在数据库中的用户信息。

于 2011-08-21T17:46:40.613 回答