2012-10-08 25 views
3

在我們的索引文件中,在文件的頂部,我們通常會將<cfparam>列出來自URL,窗體或任何地方的變量。然而,我們得到了很多機器人打我們的東西像www.example.com/survey/index.cfm?nPageNumber=-1意味着這樣的cfparam的:coldfusion更好地使用cfparam

<cfparam name="request.parameters.nPageNumber" default="1" type="numeric" /> 

將失敗歸因於廢話一個機器人正在進入查詢字符串。

我發現自己越來越有寫我cfparams這樣的:

<cfif structKeyExists(request.parameters,"nPageNumber") AND isNumeric(request.parameters.nPageNumber)> 
    <cfparam name="request.parameters.nPageNumber" default="1" type="numeric" /> 
<cfelse> 
    <cfset request.parameters.nPageNumber = 1> 
</cfif> 

雖然這解決了這個問題,我不禁覺得這個解決方案是不是最好/最有效的。我正確使用cfparam還是有更好的方法來做到這一點?

回答

5

確保存在變量並驗證其值是兩個獨立的任務。

URLForm你的存在代碼的情況下應該是這樣的:

<cfparam name="URL.nPageNumber" default="1" type="string"> 

使用的type存在只是爲了確保沒有真正離奇的發生,如值是一個結構或查詢等等,因爲你想要一個優雅的錯誤而不是500的用戶,所以你現在不想具體說明。

確定該值存在後,您需要驗證該值。

<cfif isNumeric(URL.nPageNumber) EQ false OR URL.nPageNumber LT 1 OR URL.nPageNumber GT Variables.MaxPages> 
    <cfset ArrayAppend(Variables.ErrorArray, "Incorrect page number requested.")> 
</cfif> 

你可能會迫使價值的東西神志清醒,但看到Martian Headsets了相反的觀點到robustness principle

提供錯誤信息而不是「顯示健全的東西」會告訴用戶他們做錯了什麼,並且意味着如果您還沒有(儘管您應該),您不會被迫使用canonical urls

是的,這是更多的工作。您可以爲其設計一些抽象概念,但在原始級別,這就是您應該對cfparam和驗證所做的事情。

在您不需要友善迴應的情況下,例如機器人或顯然是黑客或探測的請求時,還可以選擇提供「400」響應代碼。 w3c將響應定義爲「請求語法不好或本質上不可能滿足」。 here和「由於格式錯誤,服務器無法理解請求,客戶端不應該在沒有修改的情況下重複請求。」 here