Это девятнадцатая статья из серии, посвященной выходу 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 до его вывода на экран. Вот вам пример кода:
Код будет работать без проблем, но всегда есть “но”:
- Выражение многословно
- Разработчики частенько забывают вызвать метод Server.HtmlEncode и не существует простого способа убедиться, что кодирование использовано.
Новый блок кода <%: %>
C ASP.NET 4 мы представляем новое выражение кода (<%: %>), которое работает, как и блок <%= %>, но дополнительно автоматически кодирует HTML. Новый блок устраняет надобность явно HTML-кодировать содержимое, как мы это проделали в примере выше. Вместо этого вы просто пишете сжатый код, как показано ниже:
Мы выбрали синтаксис <%: %>, так что будет достаточно просто заменить существующие экземпляры блоков кода <%= %>.
Избегаем повторного кодирования
Так как 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, которое указывает, что возвращаемое содержимое безопасное для отрисовки и не должно быть кодировано в <%: %>
Это позволяет вам использовать методы одинаково, как в <%= %>:
Так и в блоке <%: %>:
В любом случае HTML-содержимое возвращенное вспомогательным методом будет отрисовано на клиенте, как HTML и <%: %> не будет повторно его кодировать.
Если вы же реальный хардкорщик, то у вас есть возможность создать правило сборки, которое ищет в вашем приложении места использования <%= %> и помечает их, как ошибки, тем самым принудительно заставляя использовать HTML-кодирование.
Скаффолдинг в ASP.NET MVC 2 представлениях
Когда вы используете VS 2010 (или бесплатную Web Developer 2010 Express) для построения ASP.NET MVC 2 приложений, то обнаружите, что представления, сгенерированные с помощью “Add View”, по умолчанию используют <%: %> для текстовых меток, полей и сообщений об ошибках (все, что выводится с помощью HTML-вспомогательных методов):
Итоги
Новый <%: %> синтаксис предоставляет компактный вариант автоматического HTML-кодирования содержимого и вывода на экран. Он позволяет сделать код менее многословным и быть уверенным, что все данные проходящие через ваш сайт HTML-кодированы. Все это позволит защитить ваше приложение от XSS и HTML инъекций.