HtmlEncode в сообщении для ASP.Net MVC 3 Html.TextAreaFor

У меня есть страница ASP.Net MVC 3, в которой у меня есть элемент управления Html.TextAreaFor, см. код ниже. Если я попытаюсь отправить страницу в сообщение http post с текстом в угловых скобках, например: <test>, я получаю желтый экран с сообщением:

Потенциально опасное значение Request.Form было обнаружено из client (RequestText = "").

Я не понимаю, почему я получаю это, потому что нашел статью Скотта Гатри, в которой говорится, что новый синтаксис <%: %> в .Net 4 будет автоматически HtmlEncode элемент. Поскольку я использую синтаксис <%:% > для элемента управления Html.TextAreaFor, я думал, что он автоматически позаботится об этом и преобразует угловые скобки в надлежащее "& lt"; и "& gt".

<% using (Html.BeginForm())
   { %>
    <%: Html.ValidationSummary() %>
    <h2>Enter a description of the support needed</h2>
    <%: Html.TextAreaFor( m => m.RequestText, 4, 90, null) %>
    <input type="submit" value="Submit" />
<% } %>

Ответ 1

В принципе прямо сейчас вы кодируете содержимое TextAreaFor на выходе . Это нисколько не поможет вам, поскольку вы пытаетесь справиться с вводом

Если вы хотите отправить "потенциально опасный" контент, вам нужно либо

1) украсите свойство RequestText в вашей модели ViewModel с помощью [AllowHtml]. (Предпочтительно)

[AllowHtml]
public string RequestText { get; set; }

2) отключить validateRequest

<system.web>
    <compilation debug="true" targetFramework="4.0" />
    <httpRuntime requestValidationMode="2.0" />
</system.web>

Затем вы должны убедиться, что вы должным образом дезинфицируете эти данные и/или кодируете их в своем контроллере, прежде чем отправлять их на свой уровень хранилища или базу данных.

Ответ 2

Вы можете украсить свое свойство RequestText в модели представления с помощью AllowHtmlAttribute:

[AllowHtml]
public string RequestText { get; set; }

Таким образом вы разрешаете клиенту отправлять HTML только для этого свойства.

Что касается синтаксиса <%: %>, это используется для кодирования HTML-кода до вывода его на страницу. Он используется для защиты от атак XSS. Это не имеет значения в вашем случае, потому что вы не выводите на страницу, вы получаете HTML-символы в запросе.