每页多个有状态iframe将覆盖JSESSIONID?

Nik*_*ita 6 cookies tomcat url-rewriting jsessionid

寻找某人确认或反驳我的理论,即在同一域上部署指向两个不同有状态页面的两个iframe可能导致JSESSIONID被覆盖.这就是我的意思:

建立

  1. 假设您有两个页面需要HttpSession状态(会话亲和性)才能正常运行 - 部署在http://www.foo.com/ page1http://www.foo.com/ page2
  2. 假设www.foo.com是运行Tomcat(6.0.20,fwiw)的单个主机,它使用JSESSIONID作为会话ID.
  3. 假设这些页面被转换为嵌入第三方网站的两个iframe小部件:http://www.site.com/page1"/>(和/ page2分别)
  4. 假设有第三方网站希望将两个小部件放在http:// www.bar.com /foowidgets.html

可能出现以下竞争条件吗?

  1. 一位新访问者访问http://www.bar.com/foowidgets.html
  2. 浏览器开始在foowidgets.html中加载网址,包括两个iframe的'src'网址
  3. 因为浏览器针对同一主机打开了多个并发连接(在chrome/ff情况下高达6个),浏览器碰巧同时发出了对http://www.foo.com/page1http://www.foo.com的请求/第2页
  4. tomcat @ foo.com几乎同时收到两个请求,第一次调用getSession()(在两个不同的线程上)并懒惰地创建两个HttpSession,因此创建两个JSESSIONID,值为$ Page1和$ Page2.请求还将数据填充到各个会话中(将需要数据来处理后续请求)
  5. 假设浏览器首先收到对page1请求的响应.浏览器为HOST www.foo.com设置cookie JSESSIONID = $ Page1
  6. 接收到对page2请求的下一个响应,并且浏览器 使用$ Page2 覆盖 HOST www.foo.com的cookie JSESSIONID
  7. 用户点击foowidgets.html上'page1'iframe中的内容; 浏览器向http://www.foo.com/page1?action=doSomethingStateful发出第二个请求 .该请求带有JSESSIONID = $ Page2(而不是$ Page1 - 因为cookie值被覆盖)
  8. 当foo.com收到此请求时,它会查找错误的HttpSession实例(因为JSESSIONID键是$ Page2而不是$ Page1).Foobar的!

以上可以发生吗?我是这么认为的,但我希望得到确认.

如果以上显然是可行的,那么我们想要支持每页多个iframe的解决方案是什么?我们并不需要iframe共享相同的HttpSession,尽管这样会很好.如果解决方案仍然会为每个iframe规定一个单独的HttpSession,那么当然 - iframe 1最终不会引用iframe 2的httpSession状态而不是iframe.

我能想到的是:

  1. 将page1和page2映射到不同的域(操作开销)
  2. 使用URL重写而不是cookie(搞乱分析)
  3. 还要别的吗?

非常感谢,-nikita

Mau*_*rry 0

你说的是正确的,这就是 HttpServletResponse.encodeURL() 方法存在的理由。

如果包含两个 iframe 的页面与 page1 和 page2 处于同一上下文中,则应使用此方法对 iframe 中的 URL 进行编码或使用 JSTL 的 <c:url> 标记获取。

如果尚未定义 cookie,它将在 URL 中添加 JSESSIONID。