2010-04-26 59 views
6

我了解会话固定和劫持的所有问题。我的问题非常基本:我想用PHP创建一个认证系统。为此,登录后,我只会将用户标识存储在会话中。在会话中存储什么?

但是:我见过一些人做了奇怪的事情,比如为每个用户和会话生成一个GUID,并在会话中存储它,而不仅仅是用户ID。为什么?

会话的内容不能由客户端获得 - 或者可以吗?

回答

2

简短的回答是$ _SESSION是安全并且您不必担心其内容泄露给用户或攻击者。

会话的内容不是通常可供用户访问。你应该能够存储用户的主键,你会没事的。有些情况下会话可能会泄露,在正常的linux系统中会话文件夹位于/ tmp中,但是这可以在php.ini中更改为web根目录(/ var/www/tmp),然后可以访问。唯一的另一种方式是,如果用户能够通过劫持对eval()的调用或通过正常打印的变量来访问$ _SESSION超级全局。

如果您正在共享主机上运行并使用旧版本的PHP和/或您的服务器配置错误,则该系统上的其他用户可能会读取甚至修改存储在/ tmp /中的会话文件。我不知道有一个应用程序考虑了这个攻击。如果这是一个问题,您可以将信息存储在数据库的session表中。

4

你是对的。客户端只看到一个随机生成的会话id令牌。有些方法可能会误用这个令牌(被劫持等),但在顶部有一个GUID并不会增加任何内容。相反,session.cookie_httponly(JavaScript无法看到会话cookie)session.cookie_secure(Cookie只能通过HTTPS传输)等选项可以抵御某些攻击情形。

1

有时,为了增加安全性,开发人员可以为用户会话分配一个长字符串,以便使劫持变得更加困难。通过设置与会话创建的时间这个新的字符串一个cookie,应用程序可以检查在后续请求正确的字符串,以更好地保证它究竟是谁在登录的人。

它只是增加一两件事一个崇拜者劫持者将不得不猜测。然而,它可能是一种错误的安全感,因为如果涉及嗅探,保护会话的用处不大,因为新的cookie与php会话cookie一起发送。此外,会话ID很难被猜出(因为我相信你知道,只是不要把它放在url中,而是放在cookie中)。

会话信息存储在硬盘上,因此无需应用程序干预即无法通过客户端获取。

+0

我不明白这应该如何提高安全性:如果黑客抓住他人的HTTP标头,他只会复制整个Cookie标头 - 然后他就会去。黑客应该如何在没有嗅探的情况下获得会话ID? – eWolf 2010-04-26 19:57:44

+0

这就是为什么我说:“如果涉及嗅探,保护会话的效果不大,因为新的cookie与php会话cookie一起发送。”我编辑添加“虚假的安全感”来推动点。 – webbiedave 2010-04-26 19:58:58

+0

@eWolf在会话通过GET而不是通过POST发送的愚蠢场景中,您可以获取会话ID而不用嗅探:当用户复制URL并将其粘贴到某处时,他已经放弃了会话ID。无论如何,这是无关紧要的。 – 2010-04-26 20:07:02

1

我从来没有见过用于会话的GUID,但是我看到有一些额外的方法可以增加一点安全性。

  • 存储用户的IP - 如果你需要强制基于位置的会话变化(有时GEOIP东西会这么做)
  • 存储用户的HTTP_USER_AGENT标题字符串。如果劫持者碰巧使用不同的浏览器,可以提供一些抵御劫持的安全措施。

实际上,维基百科上有一篇关于session hijacking countermeasures的文章。这就是说,我认为任何存储GUID作为会话安全中使用的会话的一部分的人可能无法看到更好的解决方案(例如会话重新生成)。我可以看到GUID的其他用途(可能它是游戏的随机生成器的一部分),但不能用于会话安全性。

+3

只是要补充一点,有些不幸的ISP经常改变他们的IP地址(有时候每隔几分钟!),所以在会话中包装IP会导致太多的麻烦。 – webbiedave 2010-04-26 20:06:09

+1

@webbiedave - 是的,我不使用它,除非有很好的理由。除非您愿意接受随之而来的问题,否则有很多理由不使用它。 – zombat 2010-04-26 20:11:17

+0

HTTP_USER_AGENT为任何攻击提供零保护,因为它是用户控制的变量。 – rook 2010-04-26 20:25:54