PHP会话安全问题

时间:2011-08-21 17:27:29

标签: php security session session-hijacking

我正在研究如何正确设置会话和防止劫持等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();     
    }

它似乎工作正常,但我的问题是:这有多安全,这是一个好方法还是我应该尝试别的?这个帖子没有任何赞成或任何东西,所以不确定它是否好。

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

谢谢!

3 个答案:

答案 0 :(得分:3)

此代码存在两个主要问题。

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

2)检查用户代理与使用?is_hacker=false的get变量非常相似。如果黑客拥有会话ID,那么他就拥有了用户代理并且无需欺骗。

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

即使进行了此检查,CSRF和XSS仍可用于影响会话。 XSS可用于读取CSRF令牌,然后使用XHR发出攻击者所需的任何请求。有人可以说这是试图缓解OWASP a9,但实际上你需要使用SSL来保护会话ID。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我同意Rook的评论,这是对你的代码的一个非常好的分析。

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

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

如果您需要了解有关PHP session security I've got a series of blog posts on the subject的更多信息。