security - 使用 Play 框架 1.2.7 进行 session 复制

标签 security playframework session-cookies playframework-1.x

我们有一个基于 Play 框架 1 构建的 Web 应用程序。Play 的当前版本是 1.2.7。它在 Amazon EC2 实例中的 Ubuntu 12.04 上运行。

最近,我们在测试服务器上遇到了一种奇怪且非常令人担忧的行为。只有少数人在使用该系统:少数开发人员和少数测试人员。发生的事情是一个用户的 session cookie 被提供给了另外两个用户。假设您有用户 A、B 和 C 使用系统,每个用户都以自己的身份登录。突然发生的事情是,他们似乎都以用户 A 的身份登录,没有任何人做任何特别的事情。

Play 正在管理自己的 session cookie。假设 session cookie 名称配置为 XYZ_SESSION。当我们看到这种行为时,我能够检查用户 A 和 B 的 session cookie(C 在不同的组织和站点中)。 B 拥有的 session cookie 与 A 拥有的 100% 相同。在这个应用程序中, session cookie 用于存储用户名、电子邮件地址等。所以在实践中,用户 B 突然与用户 A 具有相同的 session 。我没有检查用户 C 的 cookie,但口头报告是他突然以用户 A 的身份登录。

这实际上是第二次使用此应用程序观察到此行为。上一次是几个月前,然后开发了一个笨拙的黑客来注意情况并注销有问题的用户。但是,hack 的可维护性或可扩展性都不是很好,我们想摆脱它。最好找到问题的根本原因。

应用程序的身份验证逻辑是使用 OpenID4Java 实现的。但是,当此行为发生时,所有用户都已登录。

我们对这种行为的可能原因有一个理论。在应用程序中,我们有一个 BaseController 类,它继承了 Play 的 Controller 类,并用作所有 Controller 的基类。在 BaseController 中有一些获取和放入 session 容器的代码。在该类的代码中, session 被称为“ session ”,这意味着 Play 的 Controller 类中的静态字段。假设 Play 的增强器将增强引用以使用 Scope.Session 类中的 ThreadLocal 字段。增强将由 Play 的 ControllersEnhancer 类完成。但是,在查看 ControllersEnhancer 中的方法 enhanceThisClass 的代码时,它使用了 CtClass/getDeclaredMethods。在该方法的注释中,它说“不包括继承的方法”。我不完全理解enhancedThisClass 是如何被调用的,所以我不完全确定这个理论有多可靠。

因此,我们怀疑实际上 Play 跳过了对 BaseController 类中的代码的增强,而 Play 的 Controller 类中的静态 session 字段被照原样使用,再加上适当的线程调度将导致 session 重复!

这个问题很难重现,因此我们到目前为止还没有最终证实这是我们观察到的行为的原因。

有人有任何见解吗?在 Play 上看到过类似的行为吗?能证明理论对错?

最佳答案

在我的工作中,我们在很多应用程序中使用 play 1.2.7。上个月,我们在 Play 上看到了同样的问题。具有相同 session 的两个用户。在我们的例子中,应用程序分为两个模块(目录和结帐),目录使用 1.2.7,结帐模块使用 1.2.4。因为模块之间的区别玩!在每个模块中创建相同的 session 并将此 session 提供给用户。我不知道您的应用程序是否与我们的应用程序具有相同的结构,但如果是,我建议您看看这个。

关于security - 使用 Play 框架 1.2.7 进行 session 复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25238794/

相关文章:

JUnit 断言 play.mvc.Result 内容?

scala - Play 2.0 和 SNAPSHOT 依赖项

laravel - Laravel 存储用户 session 的位置

php - 在 PHP 中使用 session_name() - 无法访问数据

java - 如何使用 Java 构建简单的安全 Web 服务?

web-services - 在服务器上没有专用 IP 地址的情况下使用 SSL 保护 ASP.NET Web 服务

java - 在 Veracode 中使用 slf4j LOGGER 时出现 CRLF 注入(inject)漏洞 (CWE 117)

asp.net - 制作安全登录cookie

json - Playframeworks json Writes implicit 需要显式类型,为什么?

javascript - 如何仅接受来 self 的 API 服务器的 cookie