Pull to refresh

Новый синтаксис <%: %> для HTML-кодирования в ASP.NET 4 и ASP.NET MVC 2

Reading time3 min
Views12K
Original author: Scott Gu
image
Это девятнадцатая статья из серии, посвященной выходу VS 2010 и .NET4.

Сегодняшний пост охватывает маленькую, но очень полезную возможность, новый функционал синтаксиса, представленный в ASP.NET 4, позволяет автоматически кодировать HTML прямо в блоке кода.

Кодирование HTML


Межсайтовый скриптинг (XSS) и атаки по слабому HTML-кодированию являются двумя самыми распространенными проблемами безопасности, которые досаждают веб-сайтам и приложениям. Они происходят, когда хакеры находят способ внедрить клиентский скрипт, который крадет данные cookie-файлов или используют личность пользователя на сайте для нанесения вреда.

Единственный способ устранить межсайтовые атаки – быть уверенным, что все на выходе HTML-закодировано. Все это дает уверенность, что содержимое введенное или отданное пользователю, не может быть возвращено с такими тегами, как <script> и <img>.

Как происходи HTML-кодирование в наши дни

ASP.NET приложения (особенно те, которые использую ASP.NET MVC) часто полагаются на выражение в блоке кода <%= %>. Сегодня, разработчики чаще всего используют вспомогательные методы Server.HtmlEncode() или HttpUtility.Encode() для кодирования HTML до его вывода на экран. Вот вам пример кода:

image

Код будет работать без проблем, но всегда есть “но”:
  1. Выражение многословно
  2. Разработчики частенько забывают вызвать метод Server.HtmlEncode и не существует простого способа убедиться, что кодирование использовано.

Новый блок кода <%: %>


C ASP.NET 4 мы представляем новое выражение кода (<%:  %>), которое работает, как и блок <%= %>, но дополнительно автоматически кодирует HTML. Новый блок устраняет надобность явно HTML-кодировать содержимое, как мы это проделали в примере выше. Вместо этого вы просто пишете сжатый код, как показано ниже:

image

Мы выбрали синтаксис <%: %>, так что будет достаточно просто заменить существующие экземпляры блоков кода <%= %>.

Избегаем повторного кодирования


Так как HTML-кодирование является распространенной практикой, случаются ситуации, когда ваш результат уже прошел через кодирование и вы не хотите кодировать его повторно.

ASP.NET 4 представляет новый интерфейс IHtmlString (наряду с конкретной реализацией: HtmlString), который вы можете реализовать над типами, определяя было ли закодировано значение для отображения, как HTML, а следовательно значение не должно быть повторно HTML-кодировано. Блок кода <%: %> проверяет присутствие  интерфейса IHtmlString и не будет повторно HTML-кодировать результат, если значение реализует этот интерфейс. Что позволяет разработчикам избежать проблемы выбора, что использовать <%= %> или <%: %>.

Используем HTML-вспомогательные методы ASP.NET MVC с <%: %>

Сейчас я хочу показать практическое применение HTML-кодирования, рассмотрим сценарий, где вы используете HTML-вспомогательные методы в ASP.NET MVC. Данные методы чаще всего возвращают HTML. Например, вспомогательный метод Html.TextBox() возвращает следующую разметку <input type=”text”/>. В ASP.NET MVC 2 данные вспомогательные методы стали по умолчанию возвращать HtmlString, которое указывает, что возвращаемое содержимое безопасное для отрисовки и не должно быть кодировано в <%: %>

Это позволяет вам использовать методы одинаково, как в <%= %>:

image

Так и в блоке <%: %>:

image

В любом случае HTML-содержимое возвращенное вспомогательным методом будет отрисовано на клиенте, как HTML и <%: %> не будет повторно его кодировать.

Если вы же реальный хардкорщик, то у вас есть возможность создать правило сборки, которое ищет в вашем приложении места использования <%= %> и помечает их, как ошибки, тем самым принудительно заставляя использовать HTML-кодирование.

Скаффолдинг в ASP.NET MVC 2 представлениях


Когда вы используете VS 2010 (или бесплатную Web Developer 2010 Express) для построения ASP.NET MVC 2 приложений, то обнаружите, что представления, сгенерированные  с помощью “Add View”, по умолчанию используют <%: %> для текстовых меток, полей и сообщений об ошибках (все, что выводится с помощью HTML-вспомогательных методов):

image

Итоги


Новый <%: %> синтаксис предоставляет компактный вариант автоматического HTML-кодирования содержимого и вывода на экран. Он позволяет сделать код менее многословным и быть уверенным, что все данные проходящие через ваш сайт HTML-кодированы. Все это позволит защитить ваше приложение от XSS и HTML инъекций.
Tags:
Hubs:
+6
Comments45

Articles

Change theme settings