MvcHtmlString.ToHtmlString () не кодирует HTML? - PullRequest
7 голосов
/ 21 марта 2012

В связи с этим вопрос Я играю с проблемами XSS в моем проекте ASP.NET MVC, и я путаюсь с методом MvcHtmlSTring.ToHtmlString (). Из документации «Возвращает строку в кодировке HTML, которая представляет текущий объект.», Но в моем случае это не работает:

    var mvcHtmlString = MvcHtmlString.Create("<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">").ToHtmlString();

    var encoded = HttpUtility.HtmlEncode("<SCRIPT/XSS SRC=\"htpp://ha.ckers.org/css.js\">");

Вывод mvcHtmlString

<SCRIPT/XSS SRC="htpp://ha.ckers.org/css.js">

Вывод закодированного <- такое поведение я бы заподозрил! </p>

&lt;SCRIPT/XSS SRC=&quot;htpp://ha.ckers.org/css.js&quot;&gt;

Я что-то пропустил?

Ответы [ 2 ]

10 голосов
/ 21 марта 2012

MvcHtmlString (или HtmlString , или что-либо, что реализует IHtmlString ), для строк, которые должны быть дословно выведены в виде HTML, т. Е. Путем создания MvcHtmlStringВы говорите, что вам действительно нужны эти HTML-теги.

Разница в том, когда вы отправляете строку на страницу ASP.NET, используя <%: .. %> (новое в ASP.NET 4 или более поздней версии).В этом случае движок ASP.NET автоматически будет использовать для вас обычные строки HtmlEncode (или все, что не реализует IHtmlString), тогда как MvcHtmlString будет передаваться на страницу дословно / без кодировки.

, т.е. я думаю, что документациянеправильно.Существует билет для подключения с эквивалентной ошибкой в ​​документации конструктора HtmlString, которую они исправили.(Я думал, что подал, что: - / может быть, мой был закрыт как дубликат чужого?) Я не заметил, что документация MvcHtmlString тоже была неправильной.

9 голосов
/ 22 марта 2012

Документация MSDN верна, но, возможно, немного запутана.Интерфейс MvcHtmlString и IHtmlString используется для представления строки, в которой уже был закодирован HTML.MSDN говорит:

Возвращает строку в кодировке HTML, которая представляет текущий объект.

Объект, который вы передали объекту MvcHtmlString, уже был в кодировке HTML,поэтому и .ToString(), и .ToHtmlString() просто возвращают объект, который вы передали.

Обратите внимание, что в документах MSDN четко указано, что:

Методы ToHtmlString и ToString возвращаютто же значение.

Так зачем все это?Две причины:

  1. В движке представления Razor и в ASP.NET Web Forms v4 объект, реализующий IHtmlString, записывается как необработанные данные.Механизмы представления предполагают, что человек, создавший IHtmlString, уже очистил данные.
  2. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *].Хотя ToHtmlString() должен возвращать HTML, вы можете легко предположить, что ToString() может вернуть некоторую дружественную для разработчиков отладочную информацию.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...