我有一个ColdFusion应用程序,其中我希望根据某些条件来限制对某些页面的访问。我目前正在Application.cfc中这样做:
<cffunction name="OnRequestStart" access="public" returntype="boolean" output="true">
<cfargument name="TargetPage" type="string" required="true" />
<cfif not SESSION.isAdmin and REFindNoCase("/admin",ARGUMENTS.TargetPage) >
<!--- Deny non-admin access to admin pages. --->
<cfinclude template="/notauth.cfm">
<cfreturn false />
</cfif>
<cfreturn true />
</cffunction>
我主要关心的是:针对正则表达式检查TargetPage的一般方法有多脆弱,有没有办法提高此设计的安全性?具体来说,我担心避免出现“规范表示漏洞”。参见here。
例如,仅使用REFind而不是REFindNoCase可以使人们在进入“/ ADMIN /”时继续向前滑动。还有其他需要注意的地方吗?
我知道还有其他设计,例如在子文件夹中使用另一个Application.cfc,或者直接在页面代码中进行检查。但是我喜欢将所有安全代码都放在一个地方的想法。因此,请仅在无法安全地执行上述操作的情况下,或者由于某种原因确实是个坏主意时,才在您的答案中提出建议。谢谢。
最佳答案
我敢肯定互联网上有很多这样的东西,但这是我的看法:)
除非您是某个组的成员(即您是管理员),否则我为您解决特定示例的方法是维护受限制的脚本的数据库列表(黑名单)。
您可以按照自己的意愿将其复杂化,但是从简单的开始,您可以将完整脚本名称(CGI.SCRIPT_NAME
)与代表存储在APPLICATION
范围内的onApplicationStart()
范围中存储的被列入黑名单的页面的查询进行查询,该列表称为qRestrictedList
。
因此,在onRequestStart
中,您可以执行以下操作:
<cfquery name="qThisPageRestricted" dbtype="query">
SELECT * FROM qRestrictedList
WHERE ScriptName = '#CGI.SCRIPT_NAME#'
</cfquery>
<cfif qThisPageRestricted.recordCount and not SESSION.isAdmin>
<cfinclude template="/notauth.cfm">
<cfreturn false />
</cfif>
更好的是,您可以在以后通过将所有这些包装在“身份验证” CFC中并创建用户组和级别来进行扩展,即,将逻辑从
onRequestStart()
中移出并封装。但首先,将数据存储在数据库中可能是您完成此操作的更可维护的方式,并为将来更改身份验证的工作方式提供了更好的基础。
我希望这有帮助。
关于regex - 通过检查Application.onRequestStart中的ARGUMENTS.TargetPage来确保ColdFusion的安全性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4900008/