【问题标题】:Are ColdFusion CFC's very secure when access is remote?ColdFusion CFC 在远程访问时是否非常安全?
【发布时间】:2011-10-30 04:07:54
【问题描述】:

我正在使用 ColdFusion 9 和 jQuery。

我对通过 CFAJAXPROXY 使用 ColdFusion CFC 很陌生。我很好奇我的数据库是否存在风险以及如何轻松修补安全漏洞。

我把它放在页面顶部:

<cfajaxproxy cfc="brands" jsclassname="jsApp">

这是一些登录后使用的 CFC:

<!--- ADD BRAND  --->
<cffunction name="addBrand" access="remote">
    <cfargument name="SiteID" required="true">
    <cfargument name="Brand" required="true">
    <cfscript>
        LOCAL.SiteID = ARGUMENTS.SiteID;
        LOCAL.Brand = trim(left(ARGUMENTS.Brand, 50));
    </cfscript>
    <cfquery name="GetBrands">
        INSERT INTO Brands(SiteID, Brand)
        VALUES      (<cfqueryparam cfsqltype="cf_sql_integer" value="#LOCAL.SiteID#">,
                    <cfqueryparam cfsqltype="cf_sql_varchar" value="#LOCAL.Brand#">)
    </cfquery>
    <cfreturn true>
</cffunction>

这是将数据发布到 CFC 的 jQuery

$("#AddBrand").click(function() {
    NewBrand = $("#NewBrand").attr("value");
    var jro = new jsApp();
    jro.addBrand(NewBrand);
});

那么,这里有很大的安全漏洞吗? access="remote" 是否应该仅用于检索数据?

【问题讨论】:

  • 而不是两行 cfscript,&lt;cfset&gt; 怎么样? :)

标签: jquery coldfusion cfc


【解决方案1】:

嗯...请记住,如果您有一个可远程访问的方法...任何人都可以调用它。不仅仅是您的 AJAX 代码。 CF 服务器不知道请求是来自您的 AJAX 代理,还是来自其他人只是进行远程调用。

鉴于这种方法可以插入数据库,我认为您在这里有点开放。但这甚至适用于读取类型调用...您需要记住 - 默认情况下 - 任何人都可以进行远程调用并执行该读取。

您真正需要做的是实施某种身份验证和授权,因此只有经过批准的请求才能进行远程调用。让用户以某种方式建立会话(例如登录),并且只接受来自授权会话的远程请求。

【讨论】:

  • 亚当,这是你去年提出的好建议。我想出了一个很好的安全方案来保护我的 CFC。再次感谢!
【解决方案2】:

不,access='remote' 不必仅用于检索数据,但需要谨慎使用并了解安全隐患。

按照您现在设置的方式,任何人都可以通过调用将某些内容插入您的数据库(假设没有我们没有看到的其他访问控制)。因此,您可能应该实施某种类型的访问控制来保护此功能和其他功能。

现在我假设您没有在问题中使用“容易”一词,而我将使用“实际”一词。在安全方面,很少有“简单”的。

因此,您可以通过多种方式保护这些方法。很大程度上取决于你想怎么做以及你已经在做什么。

  1. 如果您使用&lt;cflogin&gt;,您可以将roles="&lt;Your Admin role name&gt;" 添加到函数中。我从未尝试过,但我怀疑它会起作用。 (我个人不喜欢这种方法有几个原因,但它是一种选择)

  2. 您可以在函数顶部放置某种授权代码。

&lt;cfif NOT mySecurityCFC.isAuthorized(COOKIE.CFID,COOKIE.CFTOKEN)&gt;&lt;cfreturn /&gt;&lt;/cfif&gt;

我也不喜欢这种方法。

  1. 您可以使用 ColdFusion 9 中 App.cfc 的新 onCFCRequest() 方法来拦截请求并通过您的授权例程运行它们。这比选项 2 更干净。我会说这是最简单的选项,并且会有效地工作,但我个人更喜欢选项 4。

  2. ColdSpring 项目有一些很好的工具可以自动创建和使用远程代理对象,这些对象还可以通过面向方面的编程 (AOP) 实现安全性。远程代理和 AOP 的组合非常强大,可以让您创建远程方法而不暴露真正的底层对象,并拦截和授权对这些方法的每个请求,而不必在每个方法中添加代码。事实上,这些方法本身甚至都不知道它们是安全的。

我会选择选项 4。这听起来像是一个令人生畏且非常高级的过程,在某些方面确实如此,但实际上它比您想象的要容易实现得多。 ColdSpring 快速入门指南中概述了这些步骤。 http://www.coldspringframework.org/index.cfm/go/documentation

【讨论】:

  • 这很有趣。我刚刚意识到 Stack Overflow 冒昧地重新编号了我的列表。在编辑屏幕中为 1,2,3,4,在显示中为 1,2,1,2。
【解决方案3】:

如果您正在检查有人在您的 Application.cfc 文件中登录,那么这很好。 AJAX 请求与任何其他请求一样,将首先通过 Application.cfc。

您可以通过在 onRequestStart() 中放置一个中止并看到没有插入任何内容来测试这一点。它可能会默默地失败并且不是最优雅的解决方案,但它会起作用。

【讨论】:

    【解决方案4】:

    这是帮助保护远程访问的 CFC 不被“未授权”应用程序调用的一种方法。

    使用verifyClient()或cffunction属性verifyClient="true"

    verifyClient() 方法和verifyClient 属性确保调用请求包含 Coldfusion 为您的应用程序生成的加密安全令牌。当您使用 &lt;cfajaxproxy&gt; 调用 CFC 时,该安全令牌将与您的数据一起隐式提交。如果该令牌未包含在请求中,Coldfusion 将引发异常。

    <cffunction name="myMethod" access="remote">
    
        <!--- Prevent requests that have not originated from this application --->
        <cfset verifyClient() >
    
        ...
    
    </cffunction>
    
    <!-- Or --->
    
    <cffunction name="myMethod" access="remote" verifyClient="true">
    
        ...
    
    <cffunction>
    

    ** Railo 3.2.x 不支持verifyClient() 方法。如果需要,您必须自己模仿这种行为。

    【讨论】:

    • 如果您知道您将始终使用其他 CF Ajax 工具的 cfajaxproxy,则此方法非常棒。但我认为,如果您想从非 CF 生成的调用(如简单的 jQuery $.ajax() 调用)进行远程 ajax 调用,它很快就会变成 PITA。
    • @Jason - 是的。如果 OP 只想从他的应用中调用 spawn,那么这是有道理的,否则使用 verifyClient() 将不是最好的方法。
    • 我最终确实实现了您的 verifyClient() 行为。谢谢你的好主意。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-25
    • 1970-01-01
    • 2014-10-24
    • 2011-10-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多