2011-08-18 51 views
5

我正在使用ColdFusion 9和jQuery。訪問遠程時,ColdFusion CFC是否非常安全?

我是通過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> 

這裏是jQuery的將數據上傳到CFC

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

那麼,這裏是否有一個很大的安全漏洞?應該訪問=「遠程」只用於檢索數據?

+0

,而不是兩個線CFSCRIPT的,怎麼樣''? :) – Henry

回答

5

不,訪問='遠程'不需要僅用於檢索數據,但它確實需要謹慎使用並理解安全含義。

你現在有這樣的設置方式,任何人都可以打電話給你的數據庫插入一些東西(假設沒有其他的訪問控制我們沒有看到)。所以你可能應該實施某種類型的訪問控制來保護這個和其他功能。

現在我假定你沒有在你的問題中寫下「容易」這個詞,而是將「實際上」這個詞代替。說到安全性,很少有「簡單」的。

所以有幾種方法可以保護這些方法。很大程度上取決於你想要做什麼以及你已經做了什麼。

  1. 如果您正在使用<cflogin>您可以添加roles="<Your Admin role name>"的功能。我從來沒有嘗試過,但我懷疑它會起作用。 (個人而言,我不喜歡這種方法有幾個原因,但它是一個選項)

  2. 您可以在函數的頂部放置某種授權碼。

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

我也不喜歡這種方法。

  1. 你可以使用App.cfc的新onCFCRequest()方法的ColdFusion 9攔截請求,並經由您的授權程序運行它們。這比選項2更清潔。我會說這是最簡單的選擇,並且可以有效地工作,但我個人更喜歡選項4。

  2. 的ColdSpring項目有一些偉大的工具自動創建和使用遠程代理對象還可以通過面向方面編程(AOP)將安全工作。遠程代理和AOP的組合是非常強大的,並且可以讓你而不暴露真實基礎對象,並攔截和授權每個請求的那些方法,而不必施蒂希碼到每一個方法創建遠程方法。事實上,這些方法本身甚至不知道它們正在得到保護。

我會選擇選項4。這可能聽起來像一個艱鉅的,非常高層次的過程,而且在某些方面它是,但它實際上是比你想象的要更容易實現了不少。 ColdSpring快速入門指南中概述了這些步驟。 http://www.coldspringframework.org/index.cfm/go/documentation

+1

這很有趣。我剛剛意識到Stack Overflow正在冒着重新編號列表的自由。在編輯屏幕中它是1,2,3,4,顯示它是1,2,1,2。 –

3

呃...請記住,如果你有一個方法是遠程訪問... 任何人可以稱之爲。不只是你的AJAX代碼。 CF服務器不知道請求是來自您的AJAX代理還是來自任何其他人只是進行遠程調用。

而且由於這種方法可以插入數據庫,所以我認爲你在這裏留下了一點空缺。但是即使在讀取類型調用時也是如此......您需要記住 - 默認情況下,任何人都可以進行遠程調用並執行讀取操作。

你真的需要做的是將某種授權&授權到位,所以只有認可的請求才能進行遠程調用。讓用戶以某種方式建立會話(如登錄),並只接受來自授權會話的遠程請求。

+0

亞當,這是你去年提供的好建議。我想出了一個很好的安全計劃來保護我的CFC。再次,謝謝! –

3

如果要檢查有人在你的Application.cfc文件中記錄的,那麼這是罰款。 AJAX請求就像任何其他請求一樣,首先會通過Application.cfc。

您可以通過放置在中止onRequestStart(),看到沒有什麼被插入測試了這一點。它可能會默默地失敗,不是最優雅的解決方案,但它會起作用。

3

這裏有一種方法可以幫助保護您的遠程訪問氯氟烴由「未經授權」的應用程序被調用。

使用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()方法。如果需要,你將不得不模仿自己的行爲。

+1

如果您知道您將始終使用其他CF Ajax工具的cfajaxproxy,則此方法非常棒。但是我認爲如果你想從非CF生成的調用(如簡單的jQuery $ .ajax()調用)發出遠程ajax調用,它很快就會成爲PITA。 –

+0

@Jason - 是的,絕對。如果OP只想調用從他的應用產生的調用,那麼它是有道理的,否則使用verifyClient()將不是最好的方法。 – jalpino

+0

我最終確實實現了你的verifyClient()行爲。感謝你這麼好的想法。 –