重新加载页面重新启动过期的会话

时间:2012-10-29 20:17:50

标签: coldfusion coldfusion-8 cflogin

我创建了一个ColdFusion登录页面和Application.cfc文件。它看起来工作正常,但我发现了一个我似乎无法修复的漏洞或漏洞。

它是一个三页的形式:登录页面;包含日期选择和其他问题的查找页面;和一个输出页面。用户登录并进行身份验证。如果会话在查找页面上到期,则用户在尝试提交查询时将路由回登录页面。但是,如果会话过期,他们可以通过刷新查找页面来绕过登录页面。

我该怎样防止这种情况?我的代码有什么问题?我希望刷新该查找页面以将它们引导到登录页面。

<cfcomponent>
    <cfset This.name = "TEST_login">
    <cfset This.Sessionmanagement="True">
    <cfset This.loginstorage="session">
    <cfset This.sessionTimeout= CreateTimespan(0,0,1,0) />

    <cferror TYPE="exception" TEMPLATE="error.cfm" MAILTO="email address">

    <cffunction name="onSessionStart">
        <cfset session.loggedIn = false>
    </cffunction>

    <cffunction name="OnRequestStart">
        <cfargument name = "request" required="true"/>

        <cfif IsDefined("Form.logout")>
            <cflogout>
        </cfif>

        <cflogin idletimeout="1200">

            <cfif NOT IsDefined("cflogin")>
                <cfinclude template="acc_hgrant_login.cfm">
                <cfabort>
            <cfelse>
                <cfif cflogin.name IS "" OR cflogin.password IS "">
                    <cfinclude template="acc_hgrant_login2.cfm">
                    <cfabort>
                <cfelse>

                    <cfquery name="loginQuery" dataSource="cfsource">
                        SELECT username, role
                        FROM users
                        WHERE
                            username = '#cflogin.name#'
                            AND password = '#cflogin.password#'
                    </cfquery>

                    <cfif loginQuery.role EQ "admin">
                        <cfloginuser name="#cflogin.name#" Password = "#cflogin.password#"
                            roles="#loginQuery.role#">

                        <cfset Session.isLoggedIn = "Yes">

                    <cfelse>

                        <cfinclude template="login3.cfm">
                        <cfabort>
                    </cfif>

                </cfif>

            </cfif>

        </cflogin>
    </cffunction>

</cfcomponent>

在每个后续页面上我添加

 <cfif not isDefined("Session.isLoggedIn")>

在每页的顶部。

然而,再次,只是在一段时间后重新加载第二页即使在它过期后也会重新开始。

感谢。

1 个答案:

答案 0 :(得分:1)

从你的描述中看不到加载页面的代码,我只能猜到这个问题。

我相信这个问题的更全面的表现是:

  

但是,如果会话过期,他们可以通过刷新查找页面来回避登录页面,并回答“是”,“是否要重新提交表单”

解决此问题的方法是在验证其凭据并设置其会话后重定向页面。一个简单的版本是:

                <cfif loginQuery.role EQ "admin">
                    <cfloginuser name="#cflogin.name#" Password = "#cflogin.password#"
                        roles="#loginQuery.role#">

                    <cfset Session.isLoggedIn = "Yes">

                    <cflocation url="#CGI.SCRIPT_NAME#?#CGI.Query_STRING#" addtoken="false">

                <cfelse>

应该是您希望在处理每个表单提交时执行cflocation的情况。最常见的反例是在要求用户更正其表单的修复验证问题时,因为重新发布表单只会重新加载验证页面;不更新数据库等