代码之家  ›  专栏  ›  技术社区  ›  noobzilla

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

  •  1
  • noobzilla  · 技术社区  · 15 年前

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

    基本上,我有三页:

    1. A页-提交给 乙页
    2. B页-检查 form.username和form.password 针对数据库(工作正常)
    3. 页 C-注销页面(我所在的位置 有问题)。

    C页引发“变量会话未定义”错误

    这是C页上的代码:

    <cfset StructClear(Session)>
    <cflocation url="index.cfm">
    

    这是B页上的代码:

    <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>
    

    如你所见,没什么好奇心:)

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

    我需要为C页做什么(我的注销页能够访问会话变量)。

    非常感谢您的指导!

    1 回复  |  直到 15 年前
        1
  •  3
  •   kevink    15 年前

    Adobe文档建议不要在整个会话中使用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>
    

    下面是一篇关于stuctcleasing会话的很好的文章 structClear and Sessions - Still bad? 来自Ray Camden的博客。

    您的示例还显示了典型的SQL注入攻击向量,请确保cfqueryparam您的form.username和form.pasword:。

    推荐文章