Asp.net mvc framework
Шрифт:
? для всех запросов, которые модифицируют данные пользователя, добавляется некий параметр, содержащий сформированное уникальное значение, например, так:где параметр hash содержит секретное значение, полученное на сервере;
? в функционале, который занимается модификацией данных, производится проверка на переданное значение параметра, в случае если оно отсутствует или не соответствует созданному, предполагается нарушение безопасности;
? злоумышленник не сможет сформировать строку параметра безопасности, т. к. не знает ее, и описанная ранее атака не сможет быть произведена путем подмены строки запроса.
Однако POST-запросы тоже могут быть подвергнуты атаке. Так, злоумышленнику
Защита от CSRF может быть осуществлена несколькими путями:
? проверка поля Referer POST-запроса может показать истинный сайт, с которого производился запрос, на основании этой проверки можно защититься от атаки;
? для каждой формы можно сформировать скрытое поле со сформированными секретными данными так, как мы делали это для GET-запросов. При отправке данных с формы скрытое поле также будет отправлено. Нам достаточно просто проверить соответствие переданных данных со сформированными на сервере, чтобы убедиться в том, что POST-запрос безопасен.
ASP.NET MVC содержит вспомогательный набор инструментов для реализации второго сценария защиты от CSRF-атак. Инструменты представляют собой метод расширения Html.AntiForgeryToken, который формирует скрытое поле в разметке:
<% using (Html.BeginForm) { %>
... // здесь набор элементов управления
<%= Html.AntiForgeryTokenO %>
<input type="submit" value="Change Password" />
<% } %>
На примере показано использование метода расширения Html.AntiForgeryToken, который в результате сформирует следующую разметку:
<input name="_RequestVerificationToken" type="hidden"
value="71QjBJILoVngYTD+UZ3JTn8KMsJ/Yo48Q2sSOLo6cgpYHc2qOG4UudRujINZtg4L" />
Для проверки этого скрытого поля на сервере необходимо добавить к вызываемым действиям атрибут ValidateAntiForgeryToken так, как показано во фрагменте кода:
[ValidateAntiForgeryToken]
public ActionResult ChangePassword(string currentPassword,
string newPassword, string confirmPassword)
Теперь любой POST-запрос к действию ChangePassword приведет к сопоставлению скрытого параметра формы с внутренним, сформированным на сервере. В случае, если параметры не совпадают, возникнет исключение, которое предотвратит несанкционированный доступ (рис. 7.11). Таким образом, проделав несложные действия, вы надежно защитите себя от CSRF-атак.
Расширения jQuery
Библиотека jQuery получила свое широкое распространение и огромную популярность не только за свои возможности в работе с DOM-моделью документа и Ajax. В большой степени популярности jQuery способствовало сообщество разработчиков, которые создавали и создают расширения к jQuery. Простота процесса создания плагинов к этой библиотеке послужила бурному росту числа расширений функционала jQuery. На текущий момент уже существует несколько тысяч всевозможных плагинов, которые помогают решать полный спектр задач на стороне клиента: от упрощения работы с данными до реализации богатых визуальных эффектов.
Существуют
плагины jQuery и для упрощения работы с Ajax. Найти их можно по адресугде на момент написания книги таких плагинов было представлено 182 штуки. В табл. 7.3 перечислены некоторые из них.
Выбор между ASP.NET Ajax и jQuery
Перед разработчиками проектов на базе ASP.NET MVC может встать вопрос: с помощью чего реализовывать работу с Ajax-запросами при разработке клиентской части проекта. И jQuery и ASP.NET Ajax выполняют схожие функции, хотя различаются в подходах. Ответ на этот вопрос зависит от требований, которые разработчики предъявляют к проекту. Рассмотрим некоторые из них по порядку.
? Расширяемость. Безусловным лидером в плане расширяемости является jQuery, к которой написано тысячи плагинов, расширяющих ее функциональность. Более того, написание своего плагина не представляет сложности, и разработчик всегда может расширить функциональность jQuery для собственных нужд.
? Сложность. Предполагается, что для работы с jQuery требуются навыки JavaScript-разработки и знание принципов работы самой библиотеки. С другой стороны, ASP.NET Ajax предлагает решение задач, связанных с Ajax-запросами декларативным путем, знакомым каждому разработчику ASP.NET.
? Перспективы. Используя jQuery, разработчик получает не только механизм управления Ajax-запросами, но и богатый функционал по работе с DOM-моделью. С помощью jQuery разработчик может производить очень быстрые и оптимизированные процедуры поиска, модификации, удаления и добавления элементов DOM. jQuery позволяет оперировать запросами с помощью мощных селекторов, основанных на синтаксисе селекторов CSS3. Это дает в руки разработчика мощный инструмент по быстрейшему доступу к любому набору элементов DOM-страницы на стороне клиента. С другой стороны, ASP.NET Ajax продолжает развиваться, и в версии 4.0 разработчиков ждет масса нововведений, которые позволят работать с данными на базе шаблонов, введут связывание данных и даже контексты данных. Эти высокоуровневые абстракции в перспективе могут значительно облегчить жизнь разработчика.
? Затратность. Использование любой JavaScript-библиотеки означает дополнительные расходы на количество пересылаемой информации от сервера клиенту. С применением GZip-сжатия на стороне сервера размер передаваемых данных при использовании библиотеки jQuery составляет около двадцати килобайт. С применением функционала ASP.NET Ajax это число может увеличиться до двух раз. Но при расчете затратности необходимо учитывать потенциальное увеличение размера JavaScript-файлов при использовании сторонних или собственных плагинов к jQuery. Кроме того, в перспективе ASP.NET Ajax получит механизм гибкого контроля над размером JavaScript-кода, когда разработчик сможет указать, какие части функционала следует использовать и отсылать клиенту, что значительно уменьшит размер пересылаемых данных.
В идеале, проект на базе ASP.NET MVC может получить приемущества обеих библиотек, если использовать их вместе. Но на практике требования к проекту могут содержать такие условия, когда разработчику приходится выбирать. В таком случае выбор приходится делать на основании рассмотренных ранее условий. Однако если ваш проект не содержит ограничений, и вы можете позволить себе использование нескольких JavaScript-файлов, то авторы книги рекомендуют вам применять обе библиотеки для получения выгоды от разного функционала, которые они предлагают.