Введение
Безопасность пользователей и их личных данных при использовании веб-приложения имеет первостепенное значение. Хотя этот руководящий принцип был признан даже на ранних этапах веб-разработки — злоумышленники находят лазейки в приложениях и могут эксплуатировать ваших пользователей.
Многие «стандартные» атаки хорошо известны и задокументированы, и защититься от них несложно. Чтобы избавить разработчика от самостоятельной реализации методов обеспечения безопасности, такие фреймворки, как 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 и рассмотрели несколько различных безопасных политик.