2011-07-23 73 views
1

關於在ASP.NET MVC中驗證/清除用戶輸入的最佳實踐的任何建議。看來ValidateInput幾乎總是需要設置爲False,因爲它不能在MVC框架內處理(甚至在觸發Action方法之前拋出錯誤)。驗證ASP.NET MVC中的輸入

那麼應如何驗證惡意輸入的輸入。我們是否需要手動篩選每個輸入並檢查它是否有字符,如<,>,「等 如果我們只希望允許某些類型的輸入,如標籤但禁止輸入和其他輸入,那麼該如何?這必須是相當常見的要求現在的Web應用程序,但我看不到太多的ASP.NET MVC自動完成這個。

回答

2

那麼我們應該如何輸入驗證惡意輸入。\

這取決於什麼例如,如果您將它存儲在關係數據庫中,那麼只要您使用參數化查詢並正確編碼用戶請求,關係數據庫不關心在給定的列中存儲例如alert('foo');。當您嘗試獲取存儲在此數據庫中的結果並在某個視圖中顯示時,可能會遇到麻煩。那時你必須確保結果是正確的HTML編碼。

因此,舉個例子,假設您在數據存儲中存儲了一些超級危險的字符串,並且希望將其顯示在您的視圖中。如果您正在使用您只需在Razor視圖引擎:將採取的讓你不正確的HTML編碼SomeProperty的價值關懷

@Html.DisplayFor(x => x.SomeProperty) 

;噸擔心。

如果您正在使用的WebForms視圖引擎:

<%= Html.DisplayFor(x => x.SomeProperty) %> 

所以,你可以看到有兩個關鍵的時刻,你應該小心與用戶輸入:

  • 始終使用參數化查詢,如果您將此用戶輸入存儲到關係數據庫中
  • 始終HTML編碼您在某些視圖上呈現時存儲的值
+0

是的,我明白了。但是,允許可能有害的輸入到數據庫中並不是一個好主意。不能保證當UI改變時它不會被錯誤輸出。當然,首先允許危險的輸入是不可接受的。 如果簡單地允許輸入該類型的輸入並將alert('foo')顯示爲輸出文本,則它對網絡來說看起來不太好。 – Judo

+3

@Judo,我不同意你的看法。只需將用戶輸入原樣存儲到數據庫中即可。只要您正確地存儲它,關係數據庫就不會關心有害輸入。相信我,如果您在將用戶輸入存儲到數據庫之前開始修改用戶輸入,那麼您將遇到的問題多於您嘗試解決的問題。所以如果你遵循我在答案中提供的兩條基本規則,你是安全的。 –

+1

@Judo - 要考慮的另一件事是,很難驗證傳入的數據是否每年都會出現無數的javascript漏洞。你基本上會在戰鬥中失敗。只需使用Razor或<%;幾乎可以保證你不會遇到任何這些問題,並且在努力方面更便宜。 – jfar