2

我有我的應用程序,並且來自安全測試團隊,我得到了一個關於用戶從我們的表單輸入中注入惡意代碼的可能性的錯誤報告。 該應用程序是在ASP.NET MVC4,.NET 4.5和EF 5中開發的。如何在請求驗證進入MVC 4之前清理輸入?

被測試的攻擊就像任何通常的html輸入一樣,但不是使用常規的<或>,我的同事正在使用<和>(以前字符的全角Unicode版本:here for the full list)。 MVC允許這些字符通過,然後以某種方式,ORM刪除字符的「寬」部分,並將標準字符和普通字符保存到數據庫中。不用說,如果在視圖的輸出中沒有正確編碼,這些字符的檢索和呈現可能導致XSS漏洞。

我現在需要的是消毒和執行規格化()所有提交琴絃任何形式在應用程序的方式。 有些人告訴我要創建一個自定義模型綁定器,但在BindModel方法中,我找不到修改字段的地方,所以稍後,框架可以識別已清除的值並識別注入。

任何建議將不勝感激。

+0

請閱讀鏈接http://stackoverflow.com/questions/19735214/allowing-only-certain-html-tags-as-user-input – Thanigainathan

+0

從我的理解,這將不適合我,因爲我不喜歡我不想允許或限制可能從輸入獲得的HTML的一部分,我想要做的就是規範化字符串以刪除所有的全角度Unicode,以便MVC內置驗證器可以對真實字符做出反應並且不會被欺騙與僞裝的人。 – CesarD

回答

2

您可以改爲提供自定義請求驗證。

public class NormalizingRequestValidator : RequestValidator 
{ 
    protected override bool IsValidRequestString(HttpContext context, string value, RequestValidationSource requestValidationSource, string collectionKey, out int validationFailureIndex) 
    { 
     return base.IsValidRequestString(context, value.Normalize(NormalizationForm.FormKC), requestValidationSource, collectionKey, out validationFailureIndex); 
    } 
} 

在web.config中

<system.web> 
    <httpRuntime targetFramework="4.5" requestValidationType="YourNamespace.NormalizingRequestValidator, YourAssembly" /> 
</system.web> 

如果還想正常化你在你的控制器接收字符串,實現自定義ValueProviderFactory。請參閱What’s the Difference Between a Value Provider and Model Binder?

注意:如果您選擇僅實施ValueProviderFactory,則必須撥打RequestValidator.Current手動驗證規範化字符串。

+0

所以,基本上,如果我按照你解釋的方式實現了自定義請求驗證器,MVC本身就會拋出「檢測到危險字符」的異常,因爲如果這些字符是不加掩飾地發送的話。 – CesarD

+1

正確。 RequestValidator用於ASP.net,因此它適用於Webforms和MVC。請注意,儘管JSON請求未經過驗證,並且控制器默認接受JSON請求! – LostInComputer

+0

所以除非我在JSON請求中發佈數據並將其保存到數據庫中,否則我不應該有任何可以僞裝的XSS攻擊風險並獲得這種驗證,對吧?我會盡快測試,稍後再回來。非常感謝所有的建議! – CesarD

相關問題