Session 一个保护coldfusion页面的简单应用程序-在会话中遇到问题

Session 一个保护coldfusion页面的简单应用程序-在会话中遇到问题,session,coldfusion,Session,Coldfusion,我正在测试如何在coldfusion中保护页面,在尝试创建用户可以注销的进程时遇到了一个问题 基本上,我有三页: 第A页-提交给的表单 B页 第B页-检查 form.username和form.password 在数据库上运行很好 页 C-注销页面,这是我所在的位置 有问题。 页面C抛出变量会话未定义错误 以下是C页上的代码: 以下是B页上的代码: 正如你所见,没有什么特别的: 现在,我认为Session变量可以被给定浏览器实例中的任何页面访问,但我显然错了 我需要做什么才能让C页我的注销页访问

我正在测试如何在coldfusion中保护页面,在尝试创建用户可以注销的进程时遇到了一个问题

基本上,我有三页:

第A页-提交给的表单 B页 第B页-检查 form.username和form.password 在数据库上运行很好 页 C-注销页面,这是我所在的位置 有问题。 页面C抛出变量会话未定义错误

以下是C页上的代码:

以下是B页上的代码:

正如你所见,没有什么特别的:

现在,我认为Session变量可以被给定浏览器实例中的任何页面访问,但我显然错了

我需要做什么才能让C页我的注销页访问会话变量


非常感谢您的指导

Adobe docs建议不要在整个会话中使用structclear,更好的方法是将会话的子元素命名为session.data,然后使用structclear。如果您确实想让代码正常工作,请尝试保存密钥会话内部,然后像这样还原它们

<cflock timeout="15" throwontimeout="No" scope="SESSION" type="EXCLUSIVE">
   <cftry>
   <cfscript>
   variables.HoldCFID = session.CFID;
   variables.HoldCFT  = session.CFToken;
   variables.HoldSID  = session.SessionID;
   variables.HoldURLT = session.URLToken;
   structClear(session);
   session.CFID      = HoldCFID;
   session.CFToken   = HoldCFT;
   session.SessionID = HoldSID;
   session.URLToken  = HoldURLT;
   </cfscript>
  <cfcatch type="Any">
    <!--- {If the session strut was cleared without saving the vars first} --->
   <cfset rc = structClear(session)>
   Session Cleared in Catch<br>
  </cfcatch>
  </cftry>
</cflock>
下面是一篇很好的文章,介绍了从Ray Camden的博客中清除会话的一些背景知识


CFQueryParam的示例也显示了SQL注入的经典攻击向量,请确保你的表单为你的。用户名和形式。谢谢。凯文。我将给这一方法一个SotoBeNordle刚刚在这里发表了另一个长的讨论。

<cfif NOT IsDefined ("form.username")>
<cflocation url="index.cfm" addtoken="No">
</cfif>


<cfquery name="test" datasource="cfdb">
SELECT * FROM USERS
WHERE USERNAME = '#FORM.username#'
AND PASSWORD = '#FORM.password#'
</cfquery>


<!---<CFSET Session.LoggedIn = "1">
<CFSET Session.FirstName = "#test.FirstName#">--->

<CFIF test.RecordCount IS 0>
<cflocation url="index.cfm" addtoken="No">
<CFSET StructClear(Session)>
<cfelse>
<CFSET Session.LoggedIn = "1">
<!---<cflocation url="test.cfm" addtoken="No">--->
</cfif> 
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<p><a href="logout.cfm">Log Out</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><br>
  This content is protected.
</p>
</body>
</html>
<cflock timeout="15" throwontimeout="No" scope="SESSION" type="EXCLUSIVE">
   <cftry>
   <cfscript>
   variables.HoldCFID = session.CFID;
   variables.HoldCFT  = session.CFToken;
   variables.HoldSID  = session.SessionID;
   variables.HoldURLT = session.URLToken;
   structClear(session);
   session.CFID      = HoldCFID;
   session.CFToken   = HoldCFT;
   session.SessionID = HoldSID;
   session.URLToken  = HoldURLT;
   </cfscript>
  <cfcatch type="Any">
    <!--- {If the session strut was cleared without saving the vars first} --->
   <cfset rc = structClear(session)>
   Session Cleared in Catch<br>
  </cfcatch>
  </cftry>
</cflock>