我需要在 JBoss 中运行的 Java Web 应用程序中防止Session Fixation,一种特定类型的会话劫持。但是,标准习语似乎在 JBoss 中不起作用。这可以解决吗?
4 回答
这个缺陷(在此处找到)为解决方案指明了方向。在 JBoss 中运行的 Tomcat 实例配置为 emptySessionPath="true",而不是默认的 "false"。这可以在.../deploy/jboss-web.deployer/server.xml
; HTTP 和 AJP 连接器都有此选项。
该功能本身用于消除包含在 JSESSIONID cookie 中的上下文路径(例如http://example.com/foo中的“foo”)。将其设置为 false 将破坏依赖跨应用程序身份验证的应用程序,其中包括使用某些门户框架构建的内容。但是,它并没有对相关应用程序产生负面影响。
这个问题和它发生的具体情况是Tomcat和JBoss中的一个问题。Tomcat 共享 emptySessionPath="true" 效果(实际上 JBoss 从 Tomcat 继承它)。
当您试图防止会话固定攻击时,这看起来确实像 Tomcat 和 JBoss 中的一个错误,但 servlet 规范(至少 2.3 版)实际上并不要求根据任何特定逻辑定义或重新定义 JSESSIONID。也许这已在以后的版本中被清除。
一种解决方法是将客户端地址存储在会话中。响应包装器应验证会话中设置的客户端地址与访问会话的客户端地址相同。
我从一个论坛中了解到下面的代码设置片段。我在下面添加了几行。但是当我在登录应用程序之后和之前打印会话 ID 时,它是相同的。我将如何测试会话固定。
D:\jboss-5.1.0.GA\bin\run.cof 文件并添加以下行。设置“JAVA_OPTS=%JAVA_OPTS%-Dorg.apache.catalina.connector.Request.SESSION_ID_CHECK=false”
in each context.xml of the jboss applications. D:\jboss-5.1.0.GA\server\default\deploy\jbossweb.sar\context.xml