Защита от Cross-Site Scripting атаки в ASP.NET

Небольшой набор правил, соблюдая которые возможность XSS атаки на ваш сайт сведется к минимуму.  Цель Cross-Site-Scripting атаки - выполнение клиентского кода в пределах вашего web-приложения. Статья эта относится именно к ASP.NET, другие платформы и языки имеют другие возможности.
Два главных правила:
Фильтрация входящих данных – любые данные от клиента это опасные данные, они должны быть проверены и обработаны. Это можно делать через RegularExpressionValidator и RangeValidator, в более сложных ситуациях подойдут регулярные выражения на стороне сервера(System.Text.RegularExpressions.Regex).
Обработка исходящих данных – Используйте HttpUtility.HtmlEncode для кодирования содержимого при отображении, которое получено от пользователя или из базы данных.
 
И так, на что стоит обратит внимание:
  • Включайте ASP.NET Request Validation
По умолчанию request validation включен в файле Machine.config. Эту настройку также можно изменить через Web.config или на самой странице.
  •  Проанализируйте отдачу HTML кода вашего сайта
Например, код такого вида Response.Write(Request.Form["name"]); передает клиенту не обработанные параметры из HTTP запроса, это не безопасно. Атакующий сможет передать в параметре, например, вот такой код: <script>alert('hello');</script> который выполнится у клиента.
  • Обрабатывайте отдаваемый HTML
Если данные которые вы отображаете созданы пользователем(например комментарии в блоге), при отображении надо воспользоваться методом HttpUtility.HtmlEncode() который заменяет все специальные символы(<, > и т.д.).
  • Кодируйте URL строки
Аналогично HTML, кодируются URL строки полученные от пользователя методом HttpUtility.UrlEncode
  • Фильтрация пользовательских данных
Если ваша ASP.NET страница с богатым функционалом принимает от пользователя данные с HTML, например, есть возможность использовать HTML форматирования, приходится отключать request validation. В таком случае стоит фильтровать все HTML тэги кроме пары базовых, типа <b> и <i>, на стороне сервера. Пример кода:
StringBuilder sb = new StringBuilder( HttpUtility.HtmlEncode(htmlInputTxt.Text));
sb.Replace("&lt;b&gt;", "<b>");
sb.Replace("&lt;/b&gt;", "</b>");
sb.Replace("&lt;i&gt;", "<i>");
sb.Replace("&lt;/i&gt;", "</i>");
  • Не доверяйте кукам(Cookie)
  • Используйте атрибут security="restricted" у frame.
  • Применяйте innerText а не innerHTML в вашем коде.

21 августа 2007 г. 13:41

Комментарии

# re: Защита от Cross-Site Scripting атаки в ASP.NET

26.08.2007 4:07 | SynteZZZ

Используйте SqlCommand в связке с SqlParameter для защиты от Sql Injection

# re: Защита от Cross-Site Scripting атаки в ASP.NET

26.08.2007 18:36 | Ковалев Антон

SynteZZZ, Sql Injection это отдельная тема. Хочу также составить краткий список правил...

Добавить комментарий






 
Copyright © Антон Ковалев