regex - 通过检查Application.onRequestStart中的ARGUMENTS.TargetPage来确保ColdFusion的安全性?

标签 regex coldfusion security

我有一个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/

相关文章:

javascript - 机器人 'click' 可以在网页上链接 JavaScript 吗?

ios - 从 String 中去除前导、尾随和超过 1 个空格

regex - 如何在非捕获组的Google表格中使用regexreplace?

javascript - 正则表达式用于匹配函数大括号内的所有内容

jquery - 如何限制在禁用的 HTML 输入对象上传递值以供 ColdFusion cfquery 处理?

iis - ColdFusion/Shibboleth - REMOTE_USER

coldfusion - 我应该在ColdFusion 9中备份什么?

c# - 为什么这个正则表达式不能正确匹配?

c++ - boost::asio::const_buffer 的安全释放

security - 如何加密/解密 Grails 域类中的列?