当远程访问时,ColdFusion CFC是否非常安全?

时间:2011-08-18 21:27:27

标签: jquery coldfusion cfc

我正在使用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”是否只能用于检索数据?

4 个答案:

答案 0 :(得分:5)

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

现在你的设置方式,任何人都可以打电话给你的数据库插入一些东西(假设没有其他我们没有看到的访问控制)。所以你可能应该实现某种类型的访问控制来保护这个和其他功能。

现在我假设你没有在你的问题中“轻易”提出这个词,我将把“实际上”这个词改为。在安全方面,很少有“简单”。

因此,有几种方法可以保护这些方法。很大程度上取决于你想要做什么以及你已经做了什么。

  1. 如果您使用的是<cflogin>,则可以将roles="<Your Admin role name>"添加到该功能中。我从未尝试过这个,但我怀疑它会起作用。 (就个人而言,我不喜欢这种方法有几个原因,但这是一个选项)

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

  3. <cfif NOT mySecurityCFC.isAuthorized(COOKIE.CFID,COOKIE.CFTOKEN)><cfreturn /></cfif>

    我也不喜欢这种方法。

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

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

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

答案 1 :(得分:3)

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

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

你真正需要做的是进行某种身份验证和授权到位,因此只有受制裁的请求才能进行远程调用。让用户以某种方式建立会话(如登录),并仅接受来自授权会话的远程请求。

答案 2 :(得分:3)

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

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

答案 3 :(得分:3)

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

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

verifyClient()方法和verifyClient属性确保调用请求包含Coldfusion为您的应用程序生成的加密安全令牌。当您使用<cfajaxproxy>拨打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()方法。如果需要,你必须自己模仿行为。