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>
编辑:此文件中有更多代码 - 但似乎无关紧要。
答案 0 :(得分:1)
如果适当调整变量的范围,会发生什么? cfid可以在变量范围中定义为null
值。
<cfif structKeyExists(session,"cfid")>
<cfcookie name="cfid" value="#session.cfid#" expires="NOW">
<cfcookie name="cftoken" value="#session.cftoken#" expires="NOW">
</cfif>
答案 1 :(得分:0)
因为您在新服务器上,我怀疑您设法让您的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。然而,它实施的方式也没有解决这个问题。