Content Security Policy (CSP) – мощный механизм безопасности‚ позволяющий контролировать ресурсы‚ которые браузер может загружать для веб-страницы. Это помогает предотвратить различные типы атак‚ включая Cross-Site Scripting (XSS). Одной из наиболее распространенных и важных директив CSP является script-src‚ и особенно важно понимать‚ почему использование unsafe-inline в этой директиве крайне нежелательно и как от него избавиться.
Что такое script-src и unsafe-inline?
Директива script-src определяет источники‚ из которых браузеру разрешено загружать JavaScript. Она принимает список источников‚ разделенных пробелами. Источниками могут быть:
- Домены: Например‚
script-src 'self' https://example.comразрешает загрузку скриптов с текущего домена и с example.com. - Ключевые слова:
'self'означает текущий домен‚'none'запрещает загрузку любых скриптов. - Хэши: Позволяют разрешить выполнение конкретных встроенных скриптов‚ используя их SHA-256 хэш.
- nonce: Позволяет разрешить выполнение скриптов‚ содержащих определенный случайный токен.
Почему unsafe-inline опасен?
Пример XSS с использованием unsafe-inline:
<input type="text" onmouseover="alert('XSS!')">
Если script-src unsafe-inline разрешен‚ при наведении курсора мыши на этот input-поле выполнится JavaScript-код alert('XSS!'). В реальной атаке злоумышленник может использовать этот код для кражи cookie‚ перенаправления пользователя на вредоносный сайт или изменения содержимого страницы.
Как избавиться от script-src unsafe-inline?
Избавление от unsafe-inline требует пересмотра и рефакторинга JavaScript-кода. Вот несколько шагов‚ которые можно предпринять:
- Используйте event listeners: Вместо использования атрибутов HTML-элементов‚ таких как
onclick‚ используйте JavaScript для добавления event listeners. Например‚ вместо<button onclick="myFunction">используйте:const button = document.querySelector('button'); button.addEventListener('click'‚ myFunction); - Используйте nonce: Если невозможно полностью избавиться от встроенного JavaScript‚ можно использовать nonce. Nonce – это случайный токен‚ который генерируется на сервере и добавляется к тегу
<script>. CSP должна быть настроена на разрешение скриптов с этим nonce. Однако‚ использование nonce требует тщательной реализации‚ чтобы избежать ошибок. - Используйте хэши: Можно использовать хэши SHA-256 для разрешения выполнения конкретных встроенных скриптов. Это более безопасный вариант‚ чем
unsafe-inline‚ но требует обновления хэша при каждом изменении скрипта.
Пример CSP без unsafe-inline
Предположим‚ у вас есть JavaScript-код в файле app.js‚ расположенном на том же домене‚ что и ваш сайт. Ваша CSP может выглядеть следующим образом:
Content-Security-Policy: default-src 'self'; script-src 'self'; style-src 'self' https://fonts.googleapis.com; img-src 'self' data:; font-src 'self' https://fonts.googleapis.com;
Эта CSP разрешает загрузку скриптов только с текущего домена ('self')‚ стилей с текущего домена и Google Fonts‚ изображений с текущего домена и data URI‚ и шрифтов с текущего домена и Google Fonts. unsafe-inline не используется‚ что значительно повышает безопасность вашего сайта.
Инструменты для тестирования CSP
Существует несколько инструментов‚ которые могут помочь вам протестировать и отладить вашу CSP:
- CSP Evaluator: https://csp-evaluator.withgoogle.com/
- SecurityHeaders.com: https://securityheaders.com/
Эти инструменты помогут вам выявить ошибки в вашей CSP и убедиться‚ что она правильно настроена.
Использование script-src unsafe-inline значительно ослабляет защиту вашего сайта от XSS-атак. Избавление от unsafe-inline требует усилий‚ но это важный шаг для повышения безопасности вашего веб-приложения; Следуйте рекомендациям‚ описанным в этой статье‚ и используйте инструменты для тестирования‚ чтобы убедиться‚ что ваша CSP настроена правильно и эффективно защищает ваш сайт.