2012-10-02 85 views
0

我有一個ASP.NET MVC 4項目,其中我在View中使用了HTML輸入元素。這個元素的值通過JQuery post調用發送到服務器。我沒有使用任何Razor語法,並且我沒有手動向Controller操作添加任何特殊代碼。無法將HTML代碼發佈到XSS攻擊服務器端

當我將其中一個後置參數設置爲HTML代碼時,調用將失敗,返回500內部服務器錯誤。我的問題是,爲了幫助阻止XSS攻擊,JQuery是否終止了呼叫,還是ASP.NET MVC?其次,我將如何關閉此功能?

回答

3

是否JQuery終止呼叫或是ASP.NET MVC?

沒有一個。這是ASP.NET引擎。這個特性在ASP.NET中很早以前就已經存在於ASP.NET中,並且自從ASP.NET MVC構建於ASP.NET之上,它就繼承了它。

二,如何關閉此功能?

通過裝飾你與[AllowHtml]屬性綁定到這個值視圖模型屬性:

public class MyViewModel 
{ 
    [AllowHtml] 
    public string Html { get; set; } 
} 

現在你可以有以下控制措施:

[HttpPost] 
public ActionResult SomeAction(MyViewModel model) 
{ 
    ... 
} 

,你是用jQuery.ajax調用併發送任意HTML內容:

$.ajax({ 
    url: '@Url.Action("SomeAction")', 
    type: 'POST', 
    data: { html: '<div>Hello World</div>' }, 
    success: function(result) { 

    } 
}); 

顯然,通過這樣做,您完全承認用戶可以將任意HTML,包括腳本和所有危險的東西發送到您的網站。因此,爲了防止XSS攻擊,請確保在將該值顯示回某個頁面之前已正確編碼該值。

+0

如果我沒有使用任何屬性會怎麼樣?操作方法的參數僅在本地。在將它們傳遞給服務器之前,我在客戶端定義正確的參數名稱及其值。 – Mark13426

+0

首先,您應該始終在應用程序中使用視圖模型。如果你不這樣做,你可以使用'[ValidateInput(false)]'屬性修飾整個動作。 –

+0

你能告訴我爲什麼我應該總是使用視圖模型而不是特定於操作的方法參數? – Mark13426

相關問題