Предотвращение межсайтовых сценариев (XSS) в Spring Boot с помощью политик безопасности содержимого (CSP)

Введение

Безопасность пользователей и их личных данных при использовании веб-приложения имеет первостепенное значение. Хотя этот руководящий принцип был признан даже на ранних этапах веб-разработки — злоумышленники находят лазейки в приложениях и могут эксплуатировать ваших пользователей.

Многие «стандартные» атаки хорошо известны и задокументированы, и защититься от них несложно. Чтобы избавить разработчика от самостоятельной реализации методов обеспечения безопасности, такие фреймворки, как Spring Boot, абстрагируются от различных мер безопасности и позволяют вам просто применять фильтры безопасности в ваших приложениях для предотвращения хорошо известных атак.

В этом кратком руководстве мы рассмотрим, что такое межсайтовый скриптинг (XSS), как кто-то может выполнить эту атаку на ваше собственное приложение и как вы можете легко предотвратить ее с помощью Spring Boot.

Что такое межсайтовый скриптинг (XSS)?

Межсайтовый скриптинг — это хорошо известный и широко распространенный эксплойт, при котором злоумышленник внедряет скрипт в веб-приложение.

Как правило, к веб-приложениям применяется политика единого источника, которая ограничивает сценарии на веб-странице для доступа к данным из источников, если их источники не совпадают. Согласно политике того же источника – если страница из надежный веб-сайт могут получить доступ к данным, взаимодействующим с пользователем (например, к файлам cookie), другие страницы из того же источника также могут делать это. В то время эта форма контроля доступа казалась достаточной для защиты целостности данных в веб-приложениях.

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

Много веб-сайты подвержены атакам с использованием межсайтовых сценариев, и сегодня это остается распространенной атакой, хотя этот тип эксплойта известен с 90-х годов.

Предотвращение XSS в приложении Spring Boot с помощью Content-Security Policy (CSP)

Spring Boot серьезно относится к безопасности, а модуль безопасности Spring реализует гибкие и мощные методы обеспечения безопасности, которые позволяют разработчикам свести к минимуму их беспокойство, когда речь идет о безопасности, что часто требует понимания на низком уровне принципов обмена сообщениями в сети. заявление.

По умолчанию Spring Boot реализует несколько заголовков безопасности:

Cache-Control: no-cache, no-store, max-age=0, must-revalidate
Pragma: no-cache
Expires: 0
X-Content-Type-Options: nosniff
Strict-Transport-Security: max-age=31536000 ; includeSubDomains
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block

X-XSS-защита включена по умолчанию! Этот заголовок безопасности пытается обнаруживать XSS пытается и блокирует их. Однако это не отказоустойчивый процесс, и браузеры имеют разные реализации детекторов. В некоторых браузерах, таких как Chrome, есть даже удалил их XSS Auditor. Кроме того, автоматическое обнаружение работает для Отраженные XSS-атаки, хотя существуют и другие типы атак.

Более современной альтернативой X-XSS-Protection является Политика безопасности контента (CSP), которые в основном касаются политик, определяющих, какие ресурсы могут быть загружены, из каких источников и в каких конечных точках. По состоянию на 2022 год CSP является лучшей мерой защиты от XSS, Clickjacking и других типов атак. Не все браузеры реализуют CSP, поэтому по умолчанию он не включен в заголовки безопасности.

Примечание: Даже при наличии CSP всегда лучше всего проверять любой пользовательский ввод и убедитесь, что обработка с использованием вашей системы безопасна, чтобы предотвратить внедрение кода.

В Spring Boot — для настройки пользовательских мер веб-безопасности вы обычно расширяете WebSecurityConfigurerAdapter класс и переопределить configure() Метод:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
	.headers()
		.contentSecurityPolicy("csp-directives");
    }
}

Если директивы политики безопасности контента (поставляемые как ;-separated string) зависят от вашего варианта использования и источников, которым вы хотите доверять:

Content-Security Policy: directive1; directive2; directive3; ... directiveN;

Например, веб-приложение может перечислить доверенные веб-сайты, с которых можно загружать сценарии:

script-src https://trusted.com;

Или вы можете не доверять любому стороннему веб-сайту:

script-src self;

Точно так же приложение может доверять плагинам:

object-src https://trusted.com

Вы можете предоставить широкий спектр директив, в том числе:

  • default-src – резерв по умолчанию
  • child-src – Действительные источники веб-воркеров
  • frame-src – Действительные источники для s и s
  • img-src – Действительные источники изображений
  • media-src – Действительные источники для , и имеют теги
  • script-src – Действительные источники скриптов (помогает предотвратить XSS)
  • style-src – Действительные источники для элементы
  • base-uri – Ограничивает ресурсы, доступные из элемент
  • frame-ancestors - Действительные родители , , и др. элементы
  • и так далее

Ознакомьтесь с нашим практическим руководством по изучению Git с рекомендациями, принятыми в отрасли стандартами и прилагаемой памяткой. Перестаньте гуглить команды Git и на самом деле изучить это!

Например, вот безопасный набор директив политики:

script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:;
object-src 'none';
base-uri 'none';
require-trusted-types-for 'script';
report-uri https://csp.example.com;

Давайте добавим их в наше приложение Spring Boot:

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
	http
	.headers()
		.contentSecurityPolicy("script-src 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' http: https:; object-src 'none'; base-uri 'none'; require-trusted-types-for 'script'; report-uri https://csp.example.com;");
    }
}

Вы можете использовать CSP-оценщик чтобы оценить, действительны ли ваши директивы CSP и безопасно, и он укажет, какие директивы легко использовать. Вот CSP-директива, которая разрешает API Google:

default-src 'self';
object-src 'none';
frame-src 'self' data:; 
script-src 'self' 'strict-dynamic' 'nonce-rAnd0m123' 'unsafe-inline' https://storage.googleapis.com; 
style-src 'self' 'unsafe-inline'; 
img-src 'self' data:; 
font-src 'self' data:;
base-uri 'self'

Заключение

В этом кратком руководстве мы рассмотрели, что такое межсайтовый скриптинг (XSS) и как он работает на комплексном уровне. Затем мы рассмотрели некоторые меры предотвращения XSS, которые можно легко реализовать с помощью Spring Boot, чтобы сделать ваши приложения безопасными, и установить Политика безопасности контента (ЦСП).

Наконец, мы изучили директивы CSP и рассмотрели несколько различных безопасных политик.

Отметка времени:

Больше от Стекабьюс