我正在使用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”是否只能用于检索数据?
答案 0 :(得分:5)
不,access ='remote'不需要仅用于检索数据,但需要仔细使用并了解安全隐患。
现在你的设置方式,任何人都可以打电话给你的数据库插入一些东西(假设没有其他我们没有看到的访问控制)。所以你可能应该实现某种类型的访问控制来保护这个和其他功能。
现在我假设你没有在你的问题中“轻易”提出这个词,我将把“实际上”这个词改为。在安全方面,很少有“简单”。
因此,有几种方法可以保护这些方法。很大程度上取决于你想要做什么以及你已经做了什么。
如果您使用的是<cflogin>
,则可以将roles="<Your Admin role name>"
添加到该功能中。我从未尝试过这个,但我怀疑它会起作用。 (就个人而言,我不喜欢这种方法有几个原因,但这是一个选项)
您可以在函数顶部放置某种授权码。
<cfif NOT mySecurityCFC.isAuthorized(COOKIE.CFID,COOKIE.CFTOKEN)><cfreturn /></cfif>
我也不喜欢这种方法。
您可以在ColdFusion 9中使用App.cfc的新onCFCRequest()
方法拦截请求并通过授权例程运行它们。这比选项2更清晰。我会说这是最简单的选择,并且可以有效地工作,但我个人更喜欢选项4。
ColdSpring项目有一些很棒的工具可以自动创建和使用远程代理对象,这些对象也可以通过面向方面编程(AOP)结合安全性。远程代理和AOP的组合非常强大,可以让您创建远程方法,而不会暴露真实的底层对象,并且可以拦截和授权对这些方法的每个请求,而无需将代码存储到每个方法中。事实上,这些方法本身甚至都不知道它们是安全的。
我会选择选项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()
方法。如果需要,你必须自己模仿行为。