Content Security Policy (CSP) – мощный механизм безопасности, позволяющий контролировать ресурсы, которые браузер может загружать для веб-страницы․ Это помогает предотвратить различные типы атак, включая Cross-Site Scripting (XSS)․ Одной из наиболее важных задач CSP является защита от использования функции eval, которая может быть крайне опасной․
Почему eval опасен?
Функция eval позволяет браузеру выполнить произвольный JavaScript-код, представленный в виде строки․ Это создает серьезную уязвимость, поскольку злоумышленник может внедрить вредоносный код в строку, которая затем будет выполнена браузером․ Даже если вы тщательно фильтруете входные данные, всегда есть вероятность, что злоумышленник найдет способ обойти вашу защиту․ eval также затрудняет оптимизацию JavaScript-кода браузером, что может негативно сказаться на производительности․
Как CSP защищает от eval?
CSP предоставляет директиву script-src, которая определяет, какие источники JavaScript-кода разрешены для загрузки и выполнения․ По умолчанию, если директива script-src не указана, браузер разрешает выполнение JavaScript-кода из любого источника, включая встроенный код (например, теги <script>) и код, выполняемый через eval․
Чтобы запретить использование eval, необходимо добавить директиву script-src 'none' в CSP; Это означает, что браузер не будет разрешать выполнение JavaScript-кода из каких-либо источников, включая встроенный код и код, выполняемый через eval․ При попытке выполнить eval браузер выдаст ошибку и заблокирует выполнение кода․
Пример CSP для запрета eval:
Content-Security-Policy: script-src 'none'
Другие варианты директивы script-src
Помимо 'none', директива script-src может принимать и другие значения:
- ‘self’: Разрешает выполнение JavaScript-кода только из того же домена, что и текущая страница․
- ‘unsafe-inline’: Разрешает выполнение встроенного JavaScript-кода (например, теги
<script>)․ Не рекомендуется использовать, так как это увеличивает риск XSS-атак․ - ‘unsafe-eval’: Разрешает использование
eval․ Не рекомендуется использовать, так как это сводит на нет защиту отeval, предоставляемую CSP․ - https://example․com: Разрешает выполнение JavaScript-кода только с указанного домена․
- ‘strict-dynamic’: Более сложный вариант, который позволяет динамически генерируемому JavaScript-коду выполняться, но требует использования nonce или hash для обеспечения безопасности․
Как внедрить CSP?
CSP можно внедрить несколькими способами:
- HTTP-заголовок: Самый распространенный и рекомендуемый способ․ Сервер отправляет заголовок
Content-Security-Policyвместе с ответом․
Рекомендации
При внедрении CSP следуйте этим рекомендациям:
- Начните с режима «report-only»: Это позволит вам протестировать CSP без блокировки ресурсов․ Браузер будет сообщать о нарушениях политики, но не будет их блокировать․
- Постепенно ужесточайте политику: Начните с более разрешительной политики и постепенно ужесточайте ее, чтобы избежать поломки функциональности сайта․
- Используйте nonce или hash: Если вам необходимо разрешить выполнение встроенного JavaScript-кода или динамически генерируемого кода, используйте nonce или hash для обеспечения безопасности․
- Регулярно проверяйте и обновляйте политику: Убедитесь, что ваша политика CSP актуальна и соответствует потребностям вашего сайта․
Защита от eval с помощью CSP – важный шаг в обеспечении безопасности вашего веб-приложения․ Следуя этим рекомендациям, вы можете значительно снизить риск XSS-атак и защитить своих пользователей․