[英]CFIncludes best-practice and potential security concerns
我正在編寫一個包含許多對話框/模式div的應用程序,允許用戶執行各種任務,例如上載圖像,發送電子郵件等。
我的應用程序具有基於角色的安全性,因此在您登錄時,它會檢查您的會話變量以了解您的身份,然后提供適當的功能。
目前,我的所有對話框/模式都在需要它們的頁面中。 這意味着,如果要在網站的其他位置使用相同的對話框,則必須復制代碼並將其放在該頁面上。 這立即使我認為我應該:
imageupload.cfm
和emailsend.cfm
<cfinclude>
包含這些.cfm文件,任何頁面上都希望使用它們 這個潛在的解決方案給我帶來了挑戰,因為將包含對話框的頁面上有許多if / else語句,這些語句根據用戶的角色(存儲在會話變量中)確定要呈現給哪個用戶的內容。
所以我必須:
imageupload.cfm
提供的內容將根據您的角色而有所不同 user-security.cfc
文件的保護,該文件檢查用戶是否已登錄。我還必須在每個對話框.cfm頁面中進行此調用嗎? 如果執行此操作,則同一頁面內將有兩個對同一user-security.cfc
文件的調用,因為該對話框頁面已包含在主頁中。 但是,如果我也不從.cfm對話框中調用user-security.cfc
,那么有人可以直接進入這些頁面並開始引起混亂嗎? 抱歉,這不是一個純粹的編程問題,更不是理論上的最佳實踐,但是我不確定如何在保持可擴展性的同時解決它。 我在IIS 7.5上使用ColdFusion 10
您可以按如下方式提高代碼的可重用性。
使用user-security.cfc文件的實例創建應用程序范圍變量。 在Application.cfc文件的onApplicationStart()方法中執行此操作。 像這樣:
application.SecurityChecker = CreateObject("component", "user-security");
同樣,在onApplicationStart()方法中,創建不需要安全檢查的頁面列表。
application.SecurityNotNeededPages="page1.cfm,page2.cfm,etc";
在onRequestStart()方法中使用這些變量。
var ThisPage = listlast(cgi.PATH_INFO, "/");
if (ListFindNoCase(application.SecurityNotNeededPages, ThisPage) is false) {
application.SecurityChecker.CheckSecurityMethod(argumentcollection = session);
etc
如果用戶未登錄,這將解決人們直接瀏覽包含頁面的問題。這也將使您的應用程序運行得更快,因為您只需創建一次user-security.cfc實例,即可用於每個頁面請求上的每個用戶。
編輯從這里開始
在評論中,Adam Cameron說:“而且,onRequestStart()已經收到了被請求的文件名作為參數;我認為,不需要使用CGI范圍來獲取它”。 這對我來說是個新聞,所以我認為我會檢查一下。
我運行了具有此功能的頁面。
<cffunction name="onRequestStart" access="public" returntype="boolean">
<cfdump var="#arguments#">
<cfreturn true>
</cffunction>
這給了我一個鍵1,值顯示了我實際運行的頁面的路徑。 因此,以錯誤的順序執行操作時,我閱讀了docs 。 按照這些准則,我將其添加到上面的代碼中:
<cfargument name="targetPage" required="yes">
毫不奇怪,轉儲給出了具有相同值的TARGETPAGE鍵。 然后,我將參數的名稱更改為“ fred”。 轉儲為我提供了具有相同值的FRED密鑰。
最重要的是,無論您使用發送到頁面的參數還是cgi范圍,都仍然必須使用ListLast來獲取頁面的名稱。
創建一個index.cfm頁面,該頁面基本上由一個很大的switch語句組成。 您的URL是action.subaction,即index.cfm?action = email.send。 在index.cfm中進行解析。 然后針對每種情況,根據需要檢查安全規則和cfinclude。 但是,是的,您確實需要學習一個框架。 FW / 1可以滿足您的需求,而且易於學習。 我相信Coldbox也具有極簡版本。
<cfinclude>
將對具有任何擴展名的任何文件起作用。 作為標准慣例,我將所有包含*.cfi
。
在FW / 1世界中,這特別有用。
我可以有目錄
views/reports/home.cfm
views/reports/details.cfm
views/reports/header.cfi
有效鏈接包括
index.cfm/reports/home
index.cfm/reports/details
但
index.cfm/reports/header
什么也沒做
這樣做可以與其他開發人員交流我打算對該文件進行的操作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.