只是想知道是否有人在CF10中遇到过一个问题,即当在HTTPS下的同一个应用程序的子域之间交叉时,会话被删除,即使这些链接中明确传递了JSESSIONID已经为我们工作了5年以上而没有在CF10之前失败。从我所看到的内容来看,解决CF10中的Session Fixation安全问题似乎发生了很大的变化,这解释了为什么会话会在HTTP和HTTPS之间跳跃,但这并不能解释我的问题。我理解CF 9.02和CF中引入的会话修复更改肯定会对我们通过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的行为?
干杯 菲尔
答案 0 :(得分:2)
因此,在使用了大量设置和想法之后,我现在可以通过HTTPS和使用安全(基于浏览器的)cookie在原始问题中提到的子域之间进行会话,从而满足PCI-DSS合规性要求。通过URL传递的所有JSESSIONID都已从系统中删除,并且以下行添加到Application.cfc中,用于构造函数和onSessionStart()。请注意setDomainCookies和setClientCookies设置为false以及下面的Domain特定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>