Content Security Policy: Защита от eval

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 можно внедрить несколькими способами:

  1. HTTP-заголовок: Самый распространенный и рекомендуемый способ․ Сервер отправляет заголовок Content-Security-Policy вместе с ответом․

Рекомендации

При внедрении CSP следуйте этим рекомендациям:

  • Начните с режима «report-only»: Это позволит вам протестировать CSP без блокировки ресурсов․ Браузер будет сообщать о нарушениях политики, но не будет их блокировать․
  • Постепенно ужесточайте политику: Начните с более разрешительной политики и постепенно ужесточайте ее, чтобы избежать поломки функциональности сайта․
  • Используйте nonce или hash: Если вам необходимо разрешить выполнение встроенного JavaScript-кода или динамически генерируемого кода, используйте nonce или hash для обеспечения безопасности․
  • Регулярно проверяйте и обновляйте политику: Убедитесь, что ваша политика CSP актуальна и соответствует потребностям вашего сайта․

Защита от eval с помощью CSP – важный шаг в обеспечении безопасности вашего веб-приложения․ Следуя этим рекомендациям, вы можете значительно снизить риск XSS-атак и защитить своих пользователей․