Content Security Policy (CSP) – это мощный механизм безопасности, который позволяет веб-разработчикам контролировать ресурсы, которые браузер может загружать для конкретной страницы․ Основная цель CSP – смягчить и предотвратить различные типы атак, включая Cross-Site Scripting (XSS)․ В этой статье мы подробно рассмотрим, как CSP помогает защититься от inline скриптов, почему это важно и как правильно настроить политику․
Почему inline скрипты опасны?
- Легко внедрить XSS: Злоумышленник может внедрить вредоносный inline скрипт через уязвимости в веб-приложении, например, через незащищенные формы ввода․
- Обходят некоторые защиты: Некоторые механизмы защиты от XSS могут быть неэффективны против inline скриптов․
Поэтому, одним из наиболее эффективных способов защиты от XSS является запрет на использование inline скриптов с помощью CSP;
Как CSP блокирует inline скрипты?
CSP использует директивы, которые указывают браузеру, какие источники ресурсов разрешены для загрузки․ Для блокировки inline скриптов используется директива script-src․ Чтобы запретить все inline скрипты, необходимо установить значение 'none' для этой директивы:
Content-Security-Policy: script-src 'none';
Эта политика указывает браузеру, что загружать скрипты из каких-либо источников, включая inline скрипты, запрещено․ Любые попытки выполнить inline скрипт будут заблокированы браузером․
Пример использования CSP для блокировки inline скриптов
<html>
<head>
<title>Пример</title>
</head>
<body>
<button onclick=»alert(‘XSS!’)»>Нажми меня</button>
<script>
console․log(‘Inline script’);
</script>
</body>
Если вы добавите следующую директиву CSP в заголовок ответа сервера:
Content-Security-Policy: script-src 'none';
Браузер заблокирует выполнение как атрибута onclick кнопки, так и inline скрипта внутри тега <script>․ В консоли разработчика браузера вы увидите сообщения об ошибках, указывающие на нарушение политики безопасности․
Разрешение скриптов из доверенных источников
Полный запрет на inline скрипты может быть слишком строгим для некоторых приложений․ В этом случае можно разрешить загрузку скриптов только из доверенных источников, используя директиву script-src с указанием этих источников:
Content-Security-Policy: script-src 'self' https://example․com;
В этом примере:
'self'разрешает загрузку скриптов с того же домена, что и текущая страница․https://example․comразрешает загрузку скриптов с доменаexample․com․
Браузер будет загружать скрипты только из этих источников, а все остальные, включая inline скрипты, будут заблокированы․
Использование nonce и hash
В некоторых случаях может потребоваться разрешить выполнение определенных inline скриптов․ Для этого можно использовать nonce (number used once) или hash․
Nonce
Nonce – это случайная строка, которая генерируется на сервере для каждого запроса и добавляется в директиву script-src и в атрибут nonce тега <script>:
Content-Security-Policy: script-src 'nonce-1234567890';
<script nonce="1234567890">
console․log('Allowed inline script');
</script>
Браузер выполнит только те inline скрипты, у которых атрибут nonce совпадает со значением, указанным в директиве script-src․
Hash
Hash – это криптографическая хеш-функция, которая применяеться к содержимому inline скрипта․ Затем этот хеш добавляется в директиву script-src:
Content-Security-Policy: script-src 'sha256-YOUR_HASH_VALUE';
Браузер выполнит только те inline скрипты, у которых хеш совпадает со значением, указанным в директиве script-src․
Рекомендации по внедрению CSP
- Начните с report-only mode: Сначала настройте CSP в режиме отчета (
Content-Security-Policy-Report-Only), чтобы отслеживать нарушения политики без блокировки ресурсов; - Постепенно ужесточайте политику: Начните с более мягкой политики и постепенно ужесточайте ее, добавляя новые ограничения․
- Тщательно тестируйте: Перед внедрением CSP в production, тщательно протестируйте ее, чтобы убедиться, что она не ломает функциональность вашего приложения․
- Используйте инструменты для валидации: Существуют онлайн-инструменты, которые позволяют проверить правильность настройки CSP․