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-символы в запросе.