【问题标题】:Session Cookies and Application.cfm会话 Cookie 和 Application.cfm
【发布时间】:2013-05-03 13:07:38
【问题描述】:

Application.cfm 中的这段代码(我知道它可能应该是 .cfc,但这是一些可以追溯到 MX 的旧代码)用于 CF8 和 CF9 上的 cookie 工作正常 - 但我将它移到了本地使用 CF10 开发人员版的目录,直到我注释掉该块,它才起作用。这是到达索引时的错误。

The system has attempted to use an undefined value, which usually indicates a programming error, either in your code or some system code.

Null Pointers are another name for undefined values.

The error occurred in C:/ColdFusion10/cfusion/wwwroot/TFT/Application.cfm: line 3
1 : <!--- APPLICATION settings --->
2 : <cfif IsDefined("cfid")>
3 :     <cfcookie name="cfid" value="#cfid#" expires="NOW">
4 :     <cfcookie name="cftoken" value="#cftoken#" expires="NOW">
5 : </cfif>

这是 Application.cfm 中的当前代码:

<!--- APPLICATION settings --->
<!--- 5/1/13 removed cookies temporarily
<cfif IsDefined("cfid")>
    <cfcookie name="cfid" value="#cfid#" expires="NOW">
    <cfcookie name="cftoken" value="#cftoken#" expires="NOW">
</cfif>--->

<!--- Define the application parameters--->
<cfapplication name="TFTAdmin" clientmanagement="Yes" 
    sessionmanagement="Yes" 
    setclientcookies="No" 
    sessiontimeout="#CreateTimeSpan('0','4','0','0')#" 
    applicationtimeout="#CreateTimeSpan('0','4','0','0')#">

<!--- Create cookies that disappear when the browser closes as to increase security --->
<cflock scope="session" type="readonly" timeout="5">
     <cfcookie name="cfid" value="#session.cfid#">
     <cfcookie name="cftoken" value="#session.cftoken#">
</cflock>

编辑:此文件中有更多代码 - 但似乎无关紧要。

【问题讨论】:

    标签: cookies coldfusion session-cookies coldfusion-10 application.cfc


    【解决方案1】:

    如果您正确地确定变量的范围,会发生什么? cfid 可以在变量范围内定义为 null 值。

    <cfif structKeyExists(session,"cfid")>
        <cfcookie name="cfid" value="#session.cfid#" expires="NOW">
        <cfcookie name="cftoken" value="#session.cftoken#" expires="NOW">
    </cfif>
    

    【讨论】:

    • 谢谢。我必须放在应用程序声明之后(这是有道理的),否则 session 是未定义的。
    • @Macness 上述答案不正确。 session 不属于 ColdFusion scope evaluation order。因此,原始条件与上述提议的条件并不相同。所以代码可能不会出错,但它没有完成预期的工作。请参阅我的答案以了解我的想法。
    • @nosilleg 不确定这如何使我的答案不正确?问题是 isDefined() 没有查看会话变量,因此范围评估顺序实际证明了我的观点。
    • @MattBusche 原始代码永远不会查看会话范围,您的解决方案只查看会话范围。虽然您的解决方案“有效”,但它完成的事情与代码应该做的事情不同。
    • @MattBusche 澄清一下,他说代码过去可以工作,然后在新服务器上停止工作。所以改变代码的行为并不能解决新的服务器问题。这就是为什么我说这不是一个“正确”的解决方案。
    【解决方案2】:

    因为您使用的是新服务器,所以我怀疑您设法使您的 cookie 进入了没有有意义的值的状态。

    我不确定修复代码是否重要,因为它似乎在做一些荒谬的事情。但是代码的快速修复是这样做:

    <cfif IsDefined("cfid")>
        <cfcookie name="cfid" value="" expires="NOW">
        <cfcookie name="cftoken" value="" expires="NOW">
    </cfif>
    

    它仍然只测试cfid,但它没有设置 cookie 的值。这些值无关紧要,因为代码正在使 cookie 过期。

    我之所以说代码是荒谬的,是因为Cookie 范围是scope evaluation order 的一部分。因此,整个代码所做的就是说“如果 cookie 存在,则删除它们,然后设置具有新值的新 cookie”。因此,用户将在每次页面刷新时获得新的会话。这与首先​​没有任何会话管理相同。所以你不妨设置sessionmanagement="false"并删除两个cookie代码块。

    有可能(尽管不太可能)出现此代码是因为有人希望通过不允许通过 URL/表单变量更改会话来提供一点额外的安全性,从而限制了session hijacking。然而,它的实现方式也没有解决这个问题。

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 2011-02-23
      • 1970-01-01
      • 2011-07-15
      • 2014-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多