0

用户登录应用程序后,我需要重置会话标识符。但是我已经尝试了几天,但仍然无法重置 jsessionid cookie,如果确实如此,服务器似乎无法识别它。有人可以提供一些建议或一些代码示例吗?

这是 login_action.cfm 中的代码,其中 login.cfm 将表单提交到: login form submit user credential to login_action.cfm。这是 login_action.cfm 中的代码:

<cfcookie name="JSESSIONID" value="0" expires="now">
<cfif IsDefined('cookie.JSESSIONID')>
    <cfheader name="Set-Cookie" value="JSESSIONID=0;expires=#GetHttpTimeString(CreateODBCDateTime(now()))#;path=/;HTTPOnly;secure=true;">
</cfif>
<cfset structclear(session)>

<cfhttp url="loginverify.cfm" method="post" >
    <cfhttpparam name="username" value="#form.username#" type="formfield" ><cfhttpparam name="password" value="#form.password#" type="formfield" >
</cfhttp>
<cfset cookieval = "#MID(cfhttp.responseheader['set-cookie'][1], 12, findnocase(";", cfhttp.responseheader['set-cookie'][1])-13)#">
<cfheader name="Set-Cookie" value="#cfhttp.responseheader['set-cookie'][1]#">
<cfset cookie.jsessionid = cookieval>
<cflocation url="myfirstpage.cfm" addtoken="no">

这是在 loginverify.cfm 中对用户进行身份验证的代码:

<!--- authenticate users --->
<!--- if user passed--->
<cfset session.gooduser = true>
<cfset session.userpermission = 1>

但似乎 loginverify.cfm 中定义的会话变量在 login_action.cfm 中无法识别

.

有什么建议吗?

非常感谢。

4

2 回答 2

3

只是想为此讨论添加更新的答案。自从上次在这里发表评论以来,Adobe 已经在 CF 中自动解决了会话固定问题。

如果您使用的是 CF10,或者如果您安装了 CF 9.0.2,则包括它。

如果您使用的是 9.0.1 或更低版本(回到 8.0),则有一个添加它的安全修补程序:APSB11-04(发布于 2011 年 2 月 8 日,更新于 2011 年 3 月 7 日)。

另请注意,该修复的技术说明 ( http://helpx.adobe.com/coldfusion/kb/security-hotfix-coldfusion-8-8.html ) 还提到了禁用会话固定保护的解决方法(它将适用也适用于 9.0.2 和 10 的用户):

如果将以下 JVM 属性 , 添加-Dcoldfusion.session.protectfixation=false到 CF 实例的适当 jvm.config(并重新启动),它将使 CF 恢复为不添加会话固定保护(这只会使您的服务器像以前一样容易受到固定攻击一直是)。

当然,大多数人都应该想要保护,但由于它确实给某些应用程序带来了一些问题(遗憾的是,没有很好的文档记录),只要知道它是一种在需要时关闭它的选项。

于 2012-09-21T14:00:11.967 回答
3

可以在以下位置找到您要完成的任务的更新版本:

12Robots.com - 重新访问会话令牌轮换 (回程链接)

但是,这存在不清理额外会话或保留您想要保留的任何会话数据的问题。

使用会话清理

您将无法同时登录用户并使他们的会话无效。您必须使他们的会话无效,然后在下一个请求中,让他们登录。基本流程类似于:

  1. 处理登录表单并确保用户有效
  2. 创建包含用户凭据和会话数据的安全消息以持久保存
  3. 使会话无效
  4. 将页面重新定位到自身,并在 url 中使用安全消息
  5. 使用为此页面请求创建的新会话,使用安全消息中的凭据登录用户

第 3 步(使会话无效)可以按如下方式完成:

<cfscript>
    session.setMaxInactiveInterval(1);
    getPageContext().getSession().invalidate();
</cfscript>
<cfcookie name="jsessionid" expires="now">
<cfcookie name="cfid" expires="now">
<cfcookie name="cftoken" expires="now">

然后立即重定向(cflocation),确保将 addtoken 设置为 false。

您还需要确保安全消息是临时的并且不能多次使用。因此,您将在重定向的两侧进行额外的数据库操作。

这将完成你所追求的,但可能不像你希望的那样直截了当。

简单替代

防止会话固定的另一种方法是简单地防止参考中的步骤 2发生。

最简单的情况是,如果您在 url 中看到 jsessionid、cftoken 或 cfid,则 cfabort 请求。这必须在应用程序“启动”并设置或处理客户端 cookie 之前完成。因此,在 Application.cfm 中,它将在 cfapplication 之前完成,而在 Application.cfc 中,它将在任何函数之外完成(即您设置“This.name”的位置)。

您可以更进一步,将会话标识符和 cflocation 剥离到安全 url。这也可以使用 mod_rewrite 等从 Web 服务器完成,以阻止 ColdFusion 看到有害的 url。

第 2 步还有其他方法可以发生,但所有想到的都需要您的网络服务器或用户机器受到损害,如果是这种情况,那么会话固定是您最不担心的问题。

于 2012-01-21T13:05:17.320 回答