2011-02-04 34 views
3

我有一個ColdFusion應用程序中,我希望基於某些標準來限制訪問某些網頁。目前我正在做這樣的,在的Application.cfc:ColdFusion安全性通過在Application.onRequestStart中檢查ARGUMENTS.TargetPage?

<cffunction name="OnRequestStart" access="public" returntype="boolean" output="true"> 
    <cfargument name="TargetPage" type="string" required="true" /> 
    <cfif not SESSION.isAdmin and REFindNoCase("/admin",ARGUMENTS.TargetPage) > 
    <!--- Deny non-admin access to admin pages. ---> 
    <cfinclude template="/notauth.cfm"> 
    <cfreturn false /> 
    </cfif> 
    <cfreturn true /> 
</cffunction> 

我最關心的是:如何脆弱的是檢查TargetPage對正則表達式的一般方法,以及是否有辦法改善這種設計的安全性?具體而言,我擔心避免「典型代表漏洞」。見here

例如,只用REFind代替REFindNoCase將讓人們通過,如果他們去「/ ADMIN /」向右滑動上。還有其他的事情需要注意嗎?

我知道有其他的設計,就像在一個子文件夾使用其他的Application.cfc,或直接在頁面代碼做檢查。但我喜歡把我所有的安全代碼放在一個地方。因此,如果沒有辦法安全地完成上述操作,或者出於某種原因它確實是一個壞主意,那麼請僅在您的答案中提出建議。謝謝。

+0

編輯:具體來說,我很擔心防範「規範表示漏洞。」是否ColdFusion的。規範化TargetPage不夠好,餅乾不能「欺騙」的正則表達式通過做這樣的事情「/blah/../aDmi &#n; /./index.cfm」? – CrazyPyro 2011-02-04 18:42:00

+0

一些實驗似乎表明,ColdFusion(或者它前面的Web服務器)可以在URL出現在OnRequestStart中時對其進行規範化。所以正則表達式在我最後的評論結束時不應該注意那種事情。 – CrazyPyro 2011-02-16 07:06:03

回答

0

也許值得做的正則表達式有點嚴厲:

REFindNoCase("\/admin\/([A-Za-z_]+)\.cfm", ARGUMENTS.thePage) 
+0

雖然這個正則表達式是「更嚴格的」,因此,它實際上不會像「/admin/./index.cfm」這樣的東西,除非我錯了onRequestStart如何處理URL - 請參閱我對我的問題的評論。 – CrazyPyro 2011-02-04 18:45:39

+0

根據我對我的問題的第二條評論,我糾正了/./或/../是一個問題。但是......新的正則表達式仍然存在問題:如果有人前往/admin/user2xml.js.cfm – CrazyPyro 2011-02-16 07:16:47

0

一個更好的辦法是把一個在的Application.cfc控制訪問/ admin目錄(也許基於通過日誌記錄設置會話變量以管理員身份),並且如果需要的話,讓該「子」application.cfc引用父項。

看到這個問題,就如何做到這一點的例子:Extending application.cfc in a subdirectory

1

我敢肯定有這個東西在互聯網絡裏姆斯,但這裏是我對吧:)

他們的方式我將解決你的具體例子是維護一個限制腳本的數據庫列表(黑名單),除非你是某個組的成員(即你是管理員)。

可以使這個複雜,因爲你希望,但一個簡單的開始,你可以完整的腳本名稱(CGI.SCRIPT_NAME)比較,你在onApplicationStart()加載稱爲qRestrictedList代表在APPLICATION範圍你存儲列入黑名單的網頁查詢的查詢。

所以onRequestStart,你可以做到以下幾點:

<cfquery name="qThisPageRestricted" dbtype="query"> 
    SELECT * FROM qRestrictedList 
    WHERE ScriptName = '#CGI.SCRIPT_NAME#' 
</cfquery> 

<cfif qThisPageRestricted.recordCount and not SESSION.isAdmin> 
    <cfinclude template="/notauth.cfm"> 
    <cfreturn false /> 
</cfif> 

即便通過包裝這一切都在「驗證」 CFC和創建用戶組和水平更好,您可以在此擴大在以後的日子即將您的邏輯移出onRequestStart()並封裝它。

但作爲一個開始,在數據庫中存儲數據可能會爲你完成這件事,併爲您的身份驗證是如何工作的未來變化提供一個更好的基礎更加維護的方式。

我希望這會有所幫助。