2015-07-10 61 views
6

在一個cshtml文件中,我將一個字符串分配給一個屬性。例如:我是否需要在MVC Razor中對屬性值進行編碼?

<input name="somename" value="@Model.Value"> 

由於@ Model.Value字符串可以包含任何Unicode字符,顯然必須將字符串編碼。 Razor會自動編碼這個值嗎?我猜它不會或不會,因爲我可以在它將整個事件分解成兩個標記後立即將@Html.Raw輕鬆放置。

我想我需要做的是這樣的:

<input name="somename" value="@Html.Raw(Html.AttributeEncode(Model.Value))"> 

是正確的嗎?

同樣,如果我在腳本中嵌入的JavaScript字符串的字符串值,我應該用:

//I could use Ajax instead of HttpUtility here, but Ajax just wraps the same call. 
<script>$('id').data('key','@Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))');</script> 

回答

0

剃刀自動編碼,所以你不需要。

具體來說,它是使用HttpUtility編碼/解碼方法進行編碼,並且這發生在任何不是IHtmlString如MvcHtmlString。

再次編碼將是多餘的。如果你需要逃避這種行爲,你需要使用Html.Raw幫手,如果用戶輸入你正在渲染的模型值,這可能是一個安全風險。

+0

調用@ Html.Raw(Html.AttributeEncode(Model.Value))並不是多餘的,因爲Razor只有在字符串類型時纔對最終值進行編碼。由於我對它進行了編碼並返回了一個MvcHtmlString,因此Razor不會再嘗試對其進行編碼。 * HTML屬性編碼*僅編碼* HTML編碼*所做字符的一個子集,但由於編碼使用相同的格式(例如「&name;」,「&#nnnn;」),所以編碼不需要編碼的字符,HTML編碼Razor對HTML和HTML屬性值都是足夠的。所以在這種情況下使用@ Model.Value是安全的。 – Triynko

+0

我也很清楚需要編碼以避免像HTML注入這樣的安全風險。我只是指出,除非Razor足夠聰明地知道字符串嵌入位置的上下文,否則它不可能爲HTML屬性值與HTML內容選擇不同的編碼。它沒有,並且因爲屬性編碼是HTML編碼的一個子集,所以無論Razor字符串在哪裏結束,對HTML進行編碼都很好。請參閱:http://stackoverflow.com/a/13246856/88409 – Triynko

+0

我還應該提到,在@Html的情況下。原始(HttpUtility.JavaScriptStringEncode(Model.Value)),這是絕對必要的,因爲HTML編碼是錯誤的,並且實際上可能導致安全風險。在這種情況下,您絕對必須控制編碼並確保您注入到HTML流中的注入位置正確。 – Triynko

8

Razor默認對字符串執行HTML編碼。根據您的字符串被注入HTML流的位置,這可能是也可能不是正確的編碼。如果它不是正確的編碼,那麼你需要自己執行正確的編碼,並確保返回一個MvcHtmlString(即一個IHtmlString),以確保剃刀離開你的自定義編碼。

由於Razor使用HTML編碼,這在技術上與HTML屬性編碼不同(它是一個子集),所以使用@Html.Raw(Html.AttributeEncode(Model.Value))對HTML屬性進行編碼是沒有錯誤的。同時,這也不是必需的,因爲默認的HTML編碼使用相同的基本格式,並且最終將編碼一個不需要HTML屬性值編碼的字符。另一方面,在字符串被注入到JavaScript字符串的引號中的最後一種情況下,HTML編碼絕對是不正確的,所以你肯定需要像我一樣執行編碼: @ Html.Raw(HttpUtility.JavaScriptStringEncode(Model.Value))。

相關問題