会话Cookie和Application.cfm

时间:2013-05-03 13:07:38

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

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>

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

2 个答案:

答案 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。然而,它实施的方式也没有解决这个问题。