我一直在开发在ColdFusion 2016上运行的单页面应用程序。我已经开发了登录页面,现在我想为发送到.cfc
页面的每个Ajax调用开发安全性。此文件中有许多功能,我的主要重点是检查用户Session是否存在,以及检查“登录用户”是否具有Admin
或User
访问权限。有些功能只能通过管理员权限来访问。其他功能可用于用户和管理员。这是我的会话范围的示例,该示例在成功通过身份验证后保留所有用户信息:
<cfset var appStruct = structNew()>
<cfset structInsert(appStruct, "SysAdmin", SystemAdmin, true)>
<cfset structInsert(appStruct, "UserName", UserName, true)>
<cfset structInsert(appStruct, "AccountID", AccountID, true)>
<cfset structInsert(appStruct, "Email", Email, true)>
<cfset SESSION.AccountInfo = appStruct>
一旦用户登录,上面的代码就会执行,然后在.cfc
文件的顶部进行检查:
<cfcomponent>
<cfif structKeyExists(SESSION, "AccountInfo")>
<cfset LoggedAccountID = SESSION.AccountInfo.AccountID>
<cfset isAdmin = SESSION.AccountInfo.SysAdmin EQ 1 ? true : false>
<cfelse>
<cfabort>
</cfif>
/* Here I have many functions that are used by Users and Administrators. */
</cfcomponent>
然后在每个cffunction
的最上方,我总是检查AccountInfo
会话是否存在以及管理员功能的admin访问权限是否设置为true。只能由管理员访问的功能之一的示例:
<cffunction name="findAccount" access="remote" output="false" returnformat="JSON">
<cfargument name="sessionID" type="string" required="yes" default="fakeSession">
<cfargument name="frmFindaccount_search" type="string" required="yes">
<cfset var fnResults = structNew()>
<cfset var runProcess = true>
<cfif !isAdmin OR !structKeyExists(SESSION, "sessionid") OR (SESSION.sessionid NEQ arguments.sessionID) OR !structKeyExists(VARIABLES, "LoggedAccountID")>
<cfset var fnResults.status = "400">
<cfset var fnResults.message = "Credentials Error!">
<cfreturn fnResults>
<cfabort>
</cfif>
</cffunction>
我想知道以上所有步骤是否足以保护未授权用户访问系统中的任何功能/数据?另外,其他问题也与这段代码有关:
<cfif !isAdmin OR !structKeyExists(SESSION, "sessionid") OR (SESSION.sessionid NEQ arguments.sessionID) OR !structKeyExists(VARIABLES, "LoggedAccountID")>
<cfset var fnResults.status = "400">
<cfset var fnResults.message = "Credentials Error!">
<cfreturn fnResults>
<cfabort>
</cfif>
我将此放在cffunction
中每个.cfc
的顶部(某些功能没有!isAdmin
)。我想知道这是否只能放在我的.cfc
的顶部,而不是在每个函数中都放置吗?如果有人看到任何可以改进的代码或有任何建议,请告诉我。这是我的第一个个人项目,我正在尝试遵循标准并防止出现安全漏洞。