以下问题的结论是,从http切换到https后重建会话令牌是一个好主意。
In ColdFusion do I need to reestablish session tokens after switch from http to https?
问题是,最有效的方法是什么?
答案 0 :(得分:6)
这是一个比说容易做的事情。
我已经研究了一段时间了,所以请理解您可能需要对其进行故障排除。
对于Java EE会话,我认为它更容易一些,因为您可以在会话中调用invalidate()。但不幸的是,这只是战斗的一半。你真的有几个问题需要解决。他们是
找到一些方法来存储您需要的任何现有会话数据(序列化和存储)
使旧会话无效(可能同时使用Java EE和CF会话,但使用CF会话的方式没有记录)
使旧Cookie过期
创建新会话
将您在步骤1中存储的旧会话中的数据复制到新会话中
为新会话设置新的Cookie
这看起来似乎并不太棘手,可能很难在一个请求中执行此操作,因为通常会在发出请求之前创建会话,并且在返回响应之前不会设置cookie。
我认为使用Java EE最简单,因为你可以在旧会话上调用invalidate(),并通过调用getRequestContext()得到一个新的.getSession()(我相信是这种情况,我相信它只是适用于Java EE会话。)
我已经考虑过如何使用CF Sessions做这些事情,我唯一能想到的是让新会话创建的代码向网站上的页面发出CFHTTP请求,以便创建新会话。 CFHTTP响应中将包含一个新cookie,然后您可以使旧cookie过期,并使用标记设置新cookie。
希望这有帮助
答案 1 :(得分:3)
在执行了大量测试之后,似乎杀死会话的最有效方法是使jsessionid cookie的值到期为止。
<cfcookie name="jsessionid" expires="now"/>
这显然假定使用J2EE会话变量。
如果没有使用J2EE会话变量,那么会话变量和客户端变量似乎都是CFID和CFTOKEN cookie变量的关键字。这意味着杀死会话的唯一方法是使那些值为now的cookie到期。
<cfcookie name="cftoken" expires="now"/>
<cfcookie name="cfid" expires="now"/>
此方法也会使客户端变量无效。
在不使用J2EE会话变量的情况下,杀死会话而不杀死客户端变量的最佳方法似乎是创建一个在浏览器关闭时到期的会话cookie,并在application.cfc请求处理下检查该值。如果该值不存在,请清除会话结构。
答案 2 :(得分:-1)
structDelete(session, "CFTOKEN");
structDelete(session, "CFID");
structDelete(session, "JESSIONID");
将删除结构中的键,但我不确定你是否会遇到CF'将这些变量重新应用'到会话中的问题。