2

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

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> 

编辑:有没有在这个文件的详细代码 - 但似乎无关紧要。

回答

1

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

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

谢谢。我必须在应用程序声明之后放置(这是有道理的),否则'session'是未定义的。 – Macness 2013-05-03 13:26:32

+0

@Macness上面的答案是不正确的。 'session'不是ColdFusion [范围评估顺序](http://help.adobe.com/zh_CN/ColdFusion/10.0/Developing/WSc3ff6d0ea77859461172e0811cbec09af4-7fdf.html)的一部分。因此,有条件的和上面提出的条件是不一样的。所以代码可能不会出错,但它并没有完成预期的工作。查看我的回答,了解我的想法。 – nosilleg 2013-05-07 19:40:17

+0

@nosilleg不知道这是如何使我的答案不正确?问题是'isDefined()'不看会话变量,所以范围评估顺序实际上证明了我的观点。 – 2013-05-08 01:24:16

0

因为你是在一个新的服务器上,我怀疑你设法让你的cookies进入一个没有合理值的状态。

我不确定修复代码很重要,因为它似乎在做一些无意义的事情。但是,代码的速战速决将做到这一点:

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

它仍然只测试了cfid但它不是设定的cookie的值。这些值并不重要,因为代码即将过期。

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

由于不允许通过URL /表单变量更改会话,因此有人希望提供一点额外的安全性,从而限制session hijacking,所以很可能出现此代码的可能性。然而,它的实施方式也不能解决这个问题。