2011-12-19 61 views
9

时遇到的问题,这可能不是解决的,如下:保护cookie和session

我有一个客户是在7-8不同位置的大型组织1,500+用户。该应用程序是一个基于Kohana v3.0框架构建的PHP应用程序。该组织位于ISP级别的代理过滤服务器后面。每个位置都有一个主要的公共IP地址,然后通过代理渠道到网络。每个用户都有一个雇主发布的Mac或Windows工作站。

他们正在经历的事情似乎是cookie碰撞。示例:一个用户在其工作站上登录,然后另一个用户使用相同的操作系统和浏览器类型从相同的位置,不同的工作站登录。第二个用户通过接收与第一个用户匹配的新生成的cookie(令牌)来接收第一个用户的活动会话。这似乎只与'authautologin'cookie相关(当记住我的复选框在登录屏幕上进行设置时),但我保持我的选项对代理缓存(我无法证明代理仍在缓存)。

由于网络设置,服务器可以看到数百个用户使用相同的用户代理从相同的IP地址登录。我最初的想法是,Kohana v3生成浏览器(用户代理)独有的cookie的方式对于这个真实世界的应用程序来说并不足够。

有没有人遇到过这样的事情?在Cookie和会话生成中采取适当的行动是什么?管理数据库中的Cookie和活动会话会更好吗?

  • Kohana的模块:果冻-AUTH,果冻,和验证

  • 服务器:Apache/2.2.9(Debian的)的mod_fastcgi/2.4.6的mod_jk/1.2.26 PHP/5.2.6-1 + lenny8用了Suhosin贴片的mod_ssl/2.2.9的OpenSSL/0.9.8g

  • 已知的浏览器:IE 8 & 9,火狐(OS和Win)和Safari(OS)

+0

+1:仔细提问 - 有详细的可用信息。做得好。 – 2011-12-19 16:15:28

+0

我同意,但这不是代理的问题,将适用于任何使用自动登录cookie的服务? – 2011-12-19 16:17:40

+0

@皮卡一直是我上周的想法/沮丧。然后,在问他们的内部IT人员后,我了解到代理过滤器的目的是阻止像GMail,Facebook,Twitter等网站......所以我导致他们无法访问网站之外的网站他们登录的网络。这个应用程序可能是唯一一个可以发布网络外的自动登录cookie的应用程序。 – ixasilent 2011-12-19 16:29:28

回答

2

这只是一个想法,但有/曾经是(取决于您的Debian和PHP版本)PHP会话的错误。我建议你尝试:

  1. 检查this link - 这可能并不涉及您的问题,但它是值得一试
  2. 切换到数据库驱动程序 - 我愿意付出90%的机会,这将解决一切
  3. 测试不同的Debian,然后服务器上 - 这可能并不容易实现,虽然
+0

我不认为该链接是适用的,但适当注意以备将来参考。该应用程序通过Kohana 3.0数据库和Jelly模块使用MySQL PDO。任何其他司机在脑海中?在这个服务器上有大约15个其他网站与其他没有报告这个问题的客户端相同( - 数据库内容),所以我非常肯定它与网络化妆和需要罚款调整这一个网站的Cookie生成。良好的联系!我会将其加入书签,因为它可能会解决会话超时问题,并且会在一个月后一直在我的背后的维基上发布。 – ixasilent 2011-12-19 18:54:36

+0

我的意思是切换到会话数据库驱动程序,不放弃PDO /果冻,如果这是你的想法;) – matino 2011-12-19 18:59:00

+0

你是正确的存储会话在数据库中修复此问题。说实话,我对这个解决方案并不满意,但现在可以把它当作黑客来享用。当然,当成千上万的用户再次开始使用该应用程序时,我最终看起来像个傻瓜......我会回来的!为了安全起见,我将重写kohana_cookie类的set方法为RFC 2109兼容。这至少是负责任的事情。 谢谢! – ixasilent 2011-12-19 19:40:40

2

哇这就是一个令人讨厌的漏洞, 接得好!

到目前为止,在PHP下生成cookie的最好方法是让PHP做到这一点: session_start()。就这样!如果你正在生成自己的cookie,那么你真的搞砸了。现在你可以使用超级全球$_SESSION[]。最佳实践是在您访问应用程序中的$ _SESSION之前,在公共头文件中调用session_start()

您可能还应考虑其他问题,如owasp a9,csrf和cookie标志:HTTP_Only以及“安全”标志(通过https强制cookie)。

+0

@摇滚谢谢!我已经通过代码挖了几次,并且可以验证是的,我正在使用PHP来管理会话(session_start(),session_name(),session_set_cookie_params(),session_destroy()等)。但仅仅因为你提到它,我会再次挖掘,仔细检查,并在信誉达到时提供信用。它是一个SSL站点,并设置了安全和HTTP_ONLY标志。 – ixasilent 2011-12-19 16:59:13

+0

对不起@Rook并不意味着在那里打开你的名字。 – ixasilent 2011-12-19 17:10:58

+0

@ixasilent你永远不需要设置一个cookie值。我认为你依靠kohana_cookie类来识别用户。这是使用setcookie(),这是邪恶的。 – rook 2011-12-19 17:50:29

0

我不知道如果我理解正确的你,但是......我明白,要求是这样的:

用户(工作站)==>代理()==>互联网==>公司网站(和反向的响应)。

检查代理是否设置“HTTP_X_FORWARDED_FOR”(在$ _SERVER超全局变量中)。这可能是确定用户工作站IP地址的唯一方法。如果是这样,你就完成了。

+0

关闭,但由于代理服务器也作为ISP,因此不存在HTTP_X_FORWARDED_FOR。 – ixasilent 2011-12-29 16:38:29