Методы предотвращения межсайтового скриптинга (XSS)

Опубликовано: 29 Декабря, 2021

XSS или межсайтовый скриптинг - это уязвимость веб-приложения, которая позволяет злоумышленнику внедрять уязвимое содержимое JavaScript на веб-сайт. Злоумышленник использует это, внедряя на веб-сайты, которые не дезинфицируют или плохо дезинфицируют контролируемый пользователем контент. Вводя уязвимое содержимое, пользователь может выполнять (но не ограничиваясь этим),

  1. Кража файлов cookie.
  2. Подделка веб-сайта.
  3. Обход защиты CSRF и т. Д.,

Существует несколько способов защиты веб-приложения от проблем межсайтового скриптинга. Некоторые из них включают:

  1. Фильтрация черного списка.
  2. Фильтрация белого списка.
  3. Контекстное кодирование.
  4. Проверка ввода.
  5. Политика безопасности контента.

1. Фильтрация черного списка

Легко реализовать технику фильтрации, которая лишь частично защищает сайт от проблем XSS. Он работает на основе известного списка конечных векторов XSS. Например, большинство векторов XSS используют атрибуты прослушивателя событий, такие как onerror , onmouseover , onkeypress и т. Д. Используя этот факт, пользователи, заданные атрибутами HTML, могут быть проанализированы и эти атрибуты прослушивателей событий. Это смягчит ограниченный набор векторов XSS, таких как <img src = x onerror = alert ()>.

Для таких векторов, как <a href="javascript:alert()"> XSS </a>, можно удалить схемы javascript :, data :, vbscript: из заданного пользователем HTML.

Преимущества:

  1. Эти фильтры легко реализовать в веб-приложении.
  2. Практически нулевой риск ложных срабатываний безопасного пользовательского контента, отфильтрованного этим фильтром.

Недостатки:

Но эту фильтрацию можно легко обойти, поскольку векторы XSS не конечны и не могут поддерживаться в таком состоянии. Вот список некоторых допустимых обходов этого фильтра. Эта фильтрация не защищает сайт полностью.

  1. <a href="jAvAscRipt:alert()"> XSS </a>
  2. <a href="jAvAs cRipt:alert()"> XSS </a>
  3. <a href="jAvAscRipt:prompt()"> XSS </a>

2. Фильтрация белого списка

Фильтрация по белому списку противоположна фильтрации на основе черного списка. Вместо перечисления небезопасных атрибутов и очистки пользовательского HTML с помощью этого списка, фильтрация белого списка выводит список установленных тегов и атрибутов HTML. Сущности, о которых известно, что они безопасны, поддерживаются, а все остальное будет отфильтровано.

Это максимально сокращает возможности XSS и открывает XSS только тогда, когда в самом фильтре есть лазейка, которая рассматривает некоторые небезопасные объекты как безопасные. Эта фильтрация может выполняться как на стороне клиента, так и на стороне сервера. Фильтрация по белому списку - это наиболее часто используемый фильтр в современных веб-приложениях.

Преимущества:

  1. Очень сильно снижает возможности XSS.
  2. Некоторые фильтры из белых списков, такие как фильтр защиты от несанкционированного доступа, перезаписывают пользовательский контент с помощью безопасных правил. Это приводит к переписыванию содержимого HTML в соответствии со строгими стандартами языка HTML.

Недостатки:

Чаще всего это работает, принимая небезопасный или необезвреженный HTML, анализируя их и конструируя безопасный HTML, и отвечая пользователю. Это требует высокой производительности. Использование этих фильтров в значительной степени может оказать скрытое влияние на производительность вашего современного веб-приложения.

3. Контекстное кодирование

Другой распространенный метод смягчения последствий - рассматривать все данные, предоставленные пользователем, как текстовые данные, а не как содержимое HTML, даже если это содержимое HTML. Это можно сделать, выполняя кодирование объекта HTML для пользовательских данных. Кодировка <h1> test </h1> может быть преобразована в <pre> & lt; test & gt; test & lt; / & gt; </pre> Затем браузер правильно проанализирует это и отобразит <h1> test </h1> как текст, а не как HTML-тег h1.

Преимущества :

Если все сделано правильно, контекстное кодирование полностью устраняет риск XSS.

Недостатки:

Он рассматривает все пользовательские данные как небезопасные. Таким образом, независимо от того, являются ли данные пользователя безопасными или небезопасными, все содержимое HTML будет закодировано и отображаться как простой текст.

4. Проверка ввода

В методе проверки ввода регулярное выражение применяется для всех данных параметра запроса, т. Е. Для контента, созданного пользователем. Только если контент проходит через безопасное регулярное выражение, это разрешено. В противном случае запрос будет отклонен на стороне сервера с кодом ответа 400.

Преимущества:

Проверка ввода не только сокращает XSS, но и защищает почти все уязвимости, которые могут возникнуть из-за доверия к пользовательскому контенту.

Недостатки:

  1. Возможно, удастся смягчить XSS в поле номера телефона с помощью проверки числового регулярного выражения, но для поля имени это может быть невозможно, поскольку имена могут быть на нескольких языках и могут содержать символы, отличные от ASCII, в греческом или латинском алфавитах. .
  2. Тестирование регулярных выражений требует высокой производительности. Все параметры во всех запросах к серверу должны сравниваться с регулярным выражением.

5. Политика безопасности контента

Современный браузер позволяет использовать заголовки CSP или Content Security Policy. С помощью этих заголовков можно указать список доменов, только из которых можно загружать содержимое JavaScript. Если пользователь попытается добавить уязвимый JavaScript, заголовки CSP заблокируют запрос.

Преимущества:

CSP - это наиболее продвинутая форма механизма защиты XSS. Это исключает ненадежные источники для ввода данных на веб-сайты в любой форме.

Недостатки:

Чтобы определить заголовки CSP, веб-сайты не должны использовать встроенный код JavaScript. JS должен иметь внешний вид и упоминаться в тегах скрипта. Этот набор доменов, загружающих статический контент, должен быть внесен в белый список в заголовках CSP.

Кодирование против фильтрации -

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

Рекомендуемый метод смягчения последствий для XSS -

Фильтр черного списка использовался несколько раз, и из-за постоянно растущего содержимого HTML всегда небезопасно использовать фильтр черного списка. Хотя правильная проверка ввода и заголовки CSP могут в значительной степени смягчить XSS, всегда рекомендуется кодировать или фильтровать объект на основе политики белого списка в зависимости от варианта использования. Заголовки проверки ввода и CSP могут быть добавлены в качестве дополнительного уровня защиты.


Ссылка - https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP