Coldfusion会话固定

时间:2012-01-19 22:46:31

标签: session coldfusion jsessionid

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

以下是login_action.cfm中的代码,其中login.cfm将表单提交到: 登录表单将用户凭据提交给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>

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

有什么建议吗?

非常感谢。

2 个答案:

答案 0 :(得分:3)

您要完成的更新版本可以在以下网址找到:

12Robots.com - Session token rotation REVISITED (wayback link)

然而,这样做的问题是没有清理额外的会话或继承您想要保留的任何会话数据。

使用会话清理

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

  1. 处理登录表单并确保用户有效
  2. 创建包含要保留的用户凭据和会话数据的安全邮件
  3. 使会话无效
  4. 使用网址
  5. 中的安全消息将网页重新定位到自身
  6. 使用为此页面请求创建的新会话,使用安全消息中的凭据登录用户
  7. 步骤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。

    您还需要确保安全邮件是暂时的,不能多次使用。因此,您将在重定向的两端都有其他数据库操作。

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

    简单替代

    防止会话固定的另一种方法是简单地阻止your reference中的第2步发生。

    最简单的是,如果你在网址中看到jsessionid,cftoken或cfid,那么请重新提出请求。这必须在应用程序“启动”并设置或处理客户端cookie之前完成。所以在Application.cfm中它将在cfapplication之前完成,在Application.cfc中它将在任何函数之外完成(即你设置“This.name”的地方)。

    您可以更进一步,将会话标识符和cflocation删除到安全URL。这也可以通过使用mod_rewrite等的Web服务器来完成,以阻止ColdFusion看到有害的URL。

    还有其他方法可以实现第2步,但所有想到的都需要您的网络服务器或用户计算机遭到入侵,如果是这种情况,那么会话固定是您担忧度最低的。< / p>

答案 1 :(得分: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恢复为不添加会话固定保护(这只会离开您的服务器)像往常一样容易受到固定攻击。

当然,大多数人都应该想要保护,但是因为它确实为某些应用程序引入了一些问题(遗憾的是没有详细记录),只要知道如果需要就可以关闭它。