Защита от 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() который заменяет все специальные символы(<, > и т.д.).
Аналогично HTML, кодируются URL строки полученные от пользователя методом HttpUtility.UrlEncode
- Фильтрация пользовательских данных
Если ваша ASP.NET страница с богатым функционалом принимает от пользователя данные с HTML, например, есть возможность использовать HTML форматирования, приходится отключать request validation. В таком случае стоит фильтровать все HTML тэги кроме пары базовых, типа <b> и <i>, на стороне сервера. Пример кода:
StringBuilder sb = new StringBuilder( HttpUtility.HtmlEncode(htmlInputTxt.Text));
sb.Replace("<b>", "<b>");
sb.Replace("</b>", "</b>");
sb.Replace("<i>", "<i>");
sb.Replace("</i>", "</i>");
- Не доверяйте кукам(Cookie)
- Используйте атрибут security="restricted" у frame.
- Применяйте innerText а не innerHTML в вашем коде.
21 августа 2007 г. 13:41