2010-05-19 56 views
1

如果缺少必需的querystring參數並讓global.asax將其與Application_Error一起捕獲,然後將用戶轉移到錯誤頁面,是否有任何問題導致asp.net頁面拋出(自定義錯誤)?我有幾個執行這些檢查的基類,我不確定將錯誤傳達給用戶的最佳方式。確定爲丟失的所需查詢字符串參數拋出錯誤?

所以,這樣的事情:

int reqParam; 
if(!isParamSet("myReqParam", out reqParam)) 
{ 
    throw new QuerystringParamMissingException(); 
} 

,然後通過的Application_Error Global.asax中捕獲。

另外,從安全角度來看,我應該向用戶提供多少信息?只是這是一個錯誤,或者查詢字符串參數丟失,或者缺少哪個參數,或者甚至是該參數指示的用途?

回答

3

這一切都取決於它的錯誤有多嚴重以及用戶是否可以輕鬆地從錯誤中恢復。

一種觀點是用戶不應該能夠進行無效調用 - 所有需要查詢字符串的鏈接都應該在客戶端進行驗證,因此在網站的正常運行期間,所有查詢都將是完整且有效的。因此,如果缺少參數將是一個嚴重的錯誤,因此引發異常是非常有效的方法。

如果你想阻止人們修改查詢字符串以訪問他們不應該訪問系統的某些部分,這將會很有用。他們很可能錯過一個參數,並顯示一個自定義的錯誤頁面可能不會給他們任何線索他們錯了什麼。

雖然你應該記錄錯誤 - 所以至少你知道什麼時候錯了什麼地方。

+0

我的主要目標是讓人們避免使用查詢字符串或複製粘貼querystring。我仍然沒有確定向用戶提供有關錯誤的多少信息(「所需的查詢字符串參數丟失」或「必需的查詢字符串參數XYZ丟失」)。但是,我打算記錄錯誤。 你是什麼意思「應該驗證客戶端」?如果他們想修改查詢字符串,那麼客戶端代碼會阻止它們? – balazs 2010-05-19 12:17:51

+0

@Balazs - 我的意思是,在網站的正常運行中,不應該有可能產生一個無效的查詢字符串,所以缺少的參數確實是一個例外情況。 – ChrisF 2010-05-19 12:24:57

+0

Gotcha。感謝您的澄清。 – balazs 2010-05-19 12:27:08

2

只要您不相信這種情況會出現在正常的應用程序使用情況下,這是一個可接受的解決方案。

通過讓異常出現在堆棧上,您將無法從錯誤中恢復,在這種情況下,您可能無法恢復。

0

我相信你不應該讓你的應用程序拋出一個錯誤,只要你能控制這種情況。我的意思是既然你知道什麼參數可能會丟失......所以你可以提示用戶輸入,而不是拋出錯誤,然後讓應用程序處理剩下的情況。

而是提供一個用戶友好的信息,並幫助用戶瞭解出了什麼問題!

謝謝, 保重。

+0

除了提示用戶查詢字符串值(特別是對於具有相當神祕值的參數),不是特別實用的事情。這裏的關鍵是我無法控制情況。如果缺少必需的參數,那麼我就無能爲力了。我能做的最多的事情是將它們轉移到一個錯誤頁面,讓他們知道有錯誤,也許告訴他們這是一個缺少查詢字符串參數錯誤,也許可能告訴他們哪些參數丟失。 – balazs 2010-05-19 12:25:23

0

您應該記錄用戶手動操作查詢字符串然後重定向到默認頁面(主頁或登錄頁面)所導致的錯誤(您必須確定)。 當缺少的參數是由您的應用程序f.e引起的。沒有完整的驗證用戶輸入,那麼你應該消除原因。

-1

請記住,拋出異常的性能成本。只是將頁面重定向到錯誤頁面&來處理錯誤而不會引發異常,性能更高。

話雖這麼說,這是方便,只是拋出一個異常,因爲有很多的配置,以及在ASP.NET內置機制處理異常,例如:

HttpContext.Error 
HttpContext.AllErrors 
HttpContext.IsCustomErrorEnabled 
<customErrors defaultRedirect="..."> node in the web.config