Как вы обрабатываете разрывы строк в HTML-кодировании MVC? - PullRequest
4 голосов
/ 05 октября 2010

Я не уверен в лучшем способе справиться с этим.В моем индексном представлении я отображаю сообщение, которое содержится в TempData["message"].Это позволяет мне отображать определенные сообщения об ошибках или информационные сообщения пользователю при переходе из другого действия (например, если пользователь пытается войти в действие «Редактировать», когда у него нет доступа, он возвращает его обратно в индекс с сообщением«Вы не авторизованы для редактирования этих данных»).

Перед отображением сообщения я запускаю Html.Encode(TempData["message"]).Однако недавно я столкнулся с проблемой, когда для более длинных сообщений я хочу иметь возможность отделять строки через разрывы строк (<br>).К сожалению (и очевидно), <br> кодируется Html.Encode, поэтому он не вызывает фактического переноса строки.

Как правильно обрабатывать разрывы строк в HTML-кодированных строках?

Ответы [ 5 ]

7 голосов
/ 22 июля 2011

Самое простое решение, которое я видел, это:

@MvcHtmlString.Create(Html.Encode(TempData["message"]).Replace(Environment.NewLine, "<br />"))

Если вы используете вид бритвы, вам не нужно нормально вызывать Html.Encode. По умолчанию Razor html кодирует все выходные данные. Из блога Скотта Гу, представляющего Razor :

По умолчанию содержимое, отправляемое с помощью блока @, автоматически кодируется в формате HTML для лучшей защиты от сценариев атаки XSS.

3 голосов
/ 25 августа 2012

К вашему сведению, разработчики Microsoft Web Protection Library (AKA Microsoft AntiXSS Library), похоже, сломали сборку и извлекли все предыдущие версии, которые работали.Это больше не жизнеспособное решение в его текущем состоянии.Я смотрел на это как на решение этой проблемы, прежде чем читать комментарии.Все 18 текущих оценок последней версии являются отрицательными, и они жалуются на то, что они сломаны без обновлений от разработчиков, поэтому я даже не пробовал.

Я выбрал решение @ ICodeForCoffee, так как используюБритва.Это просто и, кажется, работает довольно хорошо.Мне нужно было взять потенциально длинные описания с разрывами строк и отформатировать их так, чтобы разрывы строк проходили на странице.

Просто для полноты, вот код, который я использовал, это код @ ICodeForCoffee, модифицированный для использования поля описаниямодели вида:

@MvcHtmlString.Create(Html.Encode(Model.Description).Replace(Environment.NewLine, "<br />"))
3 голосов
/ 05 октября 2010

Я согласен с комментарием @ Роджера - на самом деле нет необходимости кодировать что-либо, над чем вы полностью контролируете.

Если вы все еще хотите быть в большей безопасности, чем сожалеть (что неплохо), вы можете использовать Microsoft AntiXss library и использовать метод .GetSafeHtmlFragment(input) - см. HTML Sanitization в библиотеке Anti-XSS

1010 *, например *

<%= AntiXss.GetSafeHtmlFragment(TempData["message"]) %>
0 голосов
/ 05 октября 2010

Попробуйте это:

StringBuilder sb = new StringBuilder();

foreach(string message in messages)
{
sb.Append(string.Format("{0}<br />", Server.HtmlEncode(message));
}

TempData["message"] = sb.ToString();
0 голосов
/ 05 октября 2010

«Обработать» сообщение в контроллере:

  1. HTMLE закодировать сообщение
  2. Вставить теги разрыва строки
  3. Добавить сообщение в коллекцию TempData.
...