我创建了一个 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")>
在每一页的顶部。
但是,同样,只要在一段时间后重新加载第二页就会重新启动会话,即使它过期也是如此。
谢谢。