首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重新加载页面重新启动过期的会话

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

Stack Overflow用户
提问于 2012-10-30 04:17:50
回答 1查看 1.3K关注 0票数 1

我已经创建了一个ColdFusion登录页面和Application.cfc文件。它似乎工作得很好,但我发现了一个似乎无法修复的bug或漏洞。

这是一个三页的表单:登录页面;带有日期选择和其他问题的查找页面;以及输出页面。用户登录并通过身份验证。如果查找页上的会话过期,则当用户尝试提交查询时,用户将被路由回登录页。但是,如果会话过期,他们只需刷新查找页面即可绕过登录页面。

我如何防止这种情况发生?我的代码中有什么地方错了?我希望任何查找页面的刷新,也可以将他们定向到登录页面。

代码语言:javascript
复制
<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>

在随后的每个页面上,我都添加了

代码语言:javascript
复制
 <cfif not isDefined("Session.isLoggedIn")>

在每一页的顶部。

然而,同样,在一段时间后重新加载第二个页面将重新启动会话,即使它过期了。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-30 16:36:48

根据您的描述,在无法看到加载页面的代码的情况下,我只能猜测问题。

我认为这个问题的一个更全面的表述是:

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

修复该问题的方法是在验证他们的凭据并设置他们的会话后重定向页面。一个简单的版本是:

代码语言:javascript
复制
                <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。最常见的计数器实例是当要求用户纠正其表单的验证问题时,因为表单的重新发布只会重新加载验证页面,而不会更新数据库等。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13128991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档