【问题标题】:Coldfusion 10 cross domain HTTPS session problemsColdfusion 10 跨域HTTPS会话问题
【发布时间】:2014-04-02 23:38:55
【问题描述】:

只是想知道是否有人在 CF10 中遇到过这样的问题,即在 HTTPS 下为同一应用程序的子域之间交叉时会话被丢弃,即使 JSESSIONID 在这些链接中明确传递,这些链接已经为我们工作了 5 年以上而没有在 CF10 之前失败。从我读到的内容看来,CF10 中的会话固定安全问题似乎有很大的变化,这解释了为什么会话会在 HTTP 和 HTTPS 之间跳转,但这并不能解释我的问题。我了解 CF 9.02 和 CF 中引入的 Session Fixation 更改肯定会对我们通过 URL 传递的 JSESSIONID 产生影响,但是此行为已被删除,但会话仍在下降。

基本上我们安装了 CF10 并打开了 J2EE 会话管理,并且默认的 HTTPOnly 设置为 true。这是一个具有相同应用程序名称的单个 CF 应用程序,setClientCookies 为 false,在应用程序中域结构如下所示:

https://book.domain.com
https://profile.domain.com
https://approve.domain.com

在跨域(之前已经工作多年)之间进行交叉时,会话会中断,CF 会发出一组新的会话标识符。

即使在 onSessionStart() 中如下设置 cookie 也无效:

<cfcookie name="jsessionid" value="#session.sessionid#" domain=".domain.com" secure="true">

有没有人在迁移到 CF10 时遇到过这种行为?

干杯 菲尔

【问题讨论】:

  • 你有没有观察到在http和https之间交叉时cookie是否被传递?
  • 嗨地牢猎人。当我观察页面的标题时,同一域上的 HTTP 和 HTTPS 之间的转换工作正常。当我在子域之间进行更改时,Coldfusion 会发出一个新的会话 cookie,这就是我试图停止的行为。
  • 由于 jsessionid cookie 是在域级别设置的,因此浏览器会将该 cookie 作为子域请求的一部分发送。子域和主域之间是否启用了会话复制?
  • 我想知道问题是否是由于从未涉及主域而纯粹是子域。您通过子域登录并在子域之间跳转,但父域是一个完全独立的网站。所以会话cookie不会在book.domain.comprofile.domain.com之间持久化

标签: session tomcat cookies coldfusion https


【解决方案1】:

因此,在尝试了一些设置和想法之后,我现在可以通过 HTTPS 和使用安全(基于浏览器)cookie 的跨子域运行会话,从而满足 PCI-DSS 合规性要求。所有通过 URL 传递的 JSESSIONID 都已从系统中删除,并将以下行添加到构造函数和 onSessionStart() 的 Application.cfc 中。请注意 setDomainCookies 和 setClientCookies 设置为 false 以及下面的特定于域的 sessioncookie 设置,并在 onSessionStart 中注意我的 cookie 设置没有过期,以确保它只持续浏览器的持续时间,以及新的 CF10 encodeValue 属性以防止奇怪的编码cookie 值的问题:

<cfcomponent hint="Application" output="false">

<cfscript>

   // Application Settings
   this.name = "myApplication";
   this.applicationTimeout = createTimeSpan(0,2,0,0);
   this.clientManagement = false;
   this.loginStorage = "session";
   this.sessionManagement = true;
   this.sessionTimeout = createTimeSpan(0,1,0,0);
   this.setClientCookies = false;
   this.setDomainCookies = false;

   // Domain specific settings for session persistence over subdomains
   this.sessioncookie.domain = '.domain.com';
   this.sessioncookie.httponly = true;

</cfscript>

<cffunction name="onSessionStart" returnType="void" output="false">
    <cfcookie name="jsessionid" value="#session.sessionid#" secure="true" domain=".domain.com" encodeValue="false">
</cffunction>

</cfcomponent>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-19
    • 2011-05-12
    • 1970-01-01
    • 2012-08-11
    • 2013-09-30
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    相关资源
    最近更新 更多