CF包括最佳实践和潜在的安全问题

时间:2014-01-11 19:19:39

标签: security coldfusion coldfusion-10

我正在编写一个应用程序,其中包含许多对话框/模态div,允许用户执行各种任务,例如上传图片,发送电子邮件等。

我的应用程序具有基于角色的安全性,因此当您登录时,它会检查您的会话变量以找出您的身份,然后提供相应的功能。

目前,我在页面中拥有所有需要它们的对话框/模态。这意味着如果我想在我的网站的其他地方使用相同的对话框,我必须复制代码并将其放在该页面上。这立刻让我觉得我应该:

  1. 为每个对话框创建一个.cfm文件,例如imageupload.cfmemailsend.cfm
  2. 使用<cfinclude>包含这些.cfm文件,其中任何页面都要使用它们
  3. 这个潜在的解决方案给我带来了挑战,因为包含对话框的页面有许多if / else语句,可根据角色(存储在会话变量中)计算出呈现给哪个用户的内容。

    所以我必须:

    1. 将if / else逻辑语句复制到对话框页面,因为 例如,imageupload.cfm提供的内容将根据您的角色而有所不同
    2. 站点中的每个页面都受到调用用户已登录的user-security.cfc文件的保护。我是否还必须在每个对话框.cfm页面中进行此调用?如果我这样做,那么将在同一页面中对同一user-security.cfc文件进行两次调用,因为对话框页面包含在主页面中。但是,如果我不在对话框.cfm中调用user-security.cfc,那么有人可以直接访问这些页面并开始造成混乱吗?
    3. 抱歉这不是一个纯粹的编程问题和更多理论上的最佳实践,但我不确定如何在保持可扩展性的同时解决它。我在IIS 7.5上使用ColdFusion 10

3 个答案:

答案 0 :(得分:3)

您可以按如下方式增加代码的可重用性。

使用user-security.cfc文件的实例创建应用程序范围变量。在Application.cfc文件的onApplicationStart()方法中执行此操作。像这样:

application.SecurityChecker = CreateObject("component", "user-security");

同样在onApplicationStart()方法中,创建一个不需要进行安全检查的页面列表。

application.SecurityNotNeededPages="page1.cfm,page2.cfm,etc";

在onRequestStart()方法中使用这些变量。

var ThisPage = listlast(cgi.PATH_INFO, "/");
if (ListFindNoCase(application.SecurityNotNeededPages, ThisPage) is false) {
application.SecurityChecker.CheckSecurityMethod(argumentcollection = session);
etc

这将解决人们在未登录时直接浏览包含页面的问题。它还可以使您的应用程序运行得更快,因为您只需创建一次user-security.cfc实例,它就会在每个页面请求中为每个用户提供。

编辑从此处开始

在评论中,Adam Cameron说:“另外,onRequestStart()已经接收了作为参数请求的文件的名称;我认为没有必要使用CGI范围来获取它。”这对我来说是新闻所以我以为我会把它检查出来。

我运行了一个具有此功能的页面。

<cffunction name="onRequestStart" access="public" returntype="boolean">
<cfdump var="#arguments#">
<cfreturn true>
</cffunction>

这给了我一个1的键,值显示了我实际运行的页面的路径。所以,以错误的顺序做事,我读了the docs。遵循这些准则,我将其添加到上面的代码中:

<cfargument name="targetPage" required="yes">

毫不奇怪,转储为TARGETPAGE提供了相同值的密钥。然后我将参数的名称改为“fred”。转储给了我一个具有相同价值的FRED钥匙。

最重要的是,无论您使用发送到页面的参数还是cgi范围,您仍然必须使用ListLast来获取页面的名称。

答案 1 :(得分:1)

创建一个index.cfm页面,主要由一个大的switch语句组成。您的URL是action.subaction,即index.cfm?action = email.send。解析index.cfm中的那个。然后针对每种情况,检查安全规则并根据需要进行cfinclude。但是,你真的需要学习一个框架。 FW / 1会做你想要的,而且很容易学习。我相信Coldbox也有极简主义版本。

答案 2 :(得分:0)

<cfinclude>适用于任何扩展名的文件。作为标准实践,我将所有包含*.cfi命名为。

在FW / 1世界中,这特别有用。

我可以使用

目录
views/reports/home.cfm
views/reports/details.cfm
views/reports/header.cfi

有效链接包括

index.cfm/reports/home
index.cfm/reports/details

但是

index.cfm/reports/header

什么都不做

这样做可以向其他开发人员传达我打算让文件做什么。