session - 如何验证 ColdFusion .cfc 页面中的有效会话和会话数据?
问题描述
我一直在开发在 ColdFusion 2016 上运行的单页应用程序。我已经开发了登录页面,现在我想为发送到.cfc
页面的每个 Ajax 调用开发安全性。该文件中有很多功能,我主要关注的是检查用户会话是否存在以及登录用户是否具有Admin
或User
访问权限。有一组功能只能通过管理员访问权限访问。其他功能可供用户和管理员使用。这是我的 Session 范围的示例,它在成功通过身份验证后保留所有用户信息:
<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
会话是否存在以及管理员权限是否设置为 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
而不是在每个函数中都有这个?如果有人看到任何可以改进的代码或有任何建议,请告诉我。这是我的第一个个人项目,我正在尝试遵循标准并防止安全线程。
解决方案
推荐阅读
- flutter - Flutter Row 滚动效果动画
- github - Github 新项目,但使用相同的现有项目
- sql - SQL:日期类型数据返回日期时间值
- openshift - “jx boot”在“openshift-3.11”提供程序中失败,“tekton 管道控制器”pod 进入“crashloopbackoff”状态
- javascript - React 路由器 V4 / V5 / V6 嵌套路由 404 net::ERR_ABORTED 404,
- ios - iOS 转换空间字符
- node.js - 自定义 NPM 模块无法从 localhost 访问已部署的服务器版本
- mongodb - 从 mongodb 集合中的每个字段获取不同的值
- javascript - 使用应用脚本在 Google 表格中进行 sha-256 加密
- javascript - 如何为具有相同索引的 iframe 提供特定链接?