在一個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>
調用@ Html.Raw(Html.AttributeEncode(Model.Value))並不是多餘的,因爲Razor只有在字符串類型時纔對最終值進行編碼。由於我對它進行了編碼並返回了一個MvcHtmlString,因此Razor不會再嘗試對其進行編碼。 * HTML屬性編碼*僅編碼* HTML編碼*所做字符的一個子集,但由於編碼使用相同的格式(例如「&name;」,「nnnn;」),所以編碼不需要編碼的字符,HTML編碼Razor對HTML和HTML屬性值都是足夠的。所以在這種情況下使用@ Model.Value是安全的。 – Triynko
我也很清楚需要編碼以避免像HTML注入這樣的安全風險。我只是指出,除非Razor足夠聰明地知道字符串嵌入位置的上下文,否則它不可能爲HTML屬性值與HTML內容選擇不同的編碼。它沒有,並且因爲屬性編碼是HTML編碼的一個子集,所以無論Razor字符串在哪裏結束,對HTML進行編碼都很好。請參閱:http://stackoverflow.com/a/13246856/88409 – Triynko
我還應該提到,在@Html的情況下。原始(HttpUtility.JavaScriptStringEncode(Model.Value)),這是絕對必要的,因爲HTML編碼是錯誤的,並且實際上可能導致安全風險。在這種情況下,您絕對必須控制編碼並確保您注入到HTML流中的注入位置正確。 – Triynko