Политика безопасности контента Google Analytics
У меня есть политика безопасности содержимого:
default-src 'none';
style-src 'self';
script-src 'self' https://www.google-analytics.com;
img-src 'self' https://www.google-analytics.com;
connect-src 'self';
На моей странице я поместил встроенный код GA в async script:
<script src="/javascript/ga.js" async></script>
Это приводит к ошибке CSP:
Отказался загрузить script 'данных: приложение /JavaScript; base64, KGZ1bmN0aW9uKCkgewoJLy8gaHR0cHM6Ly9kZXZl... 07Cgl9OwoJZ2EucmVtb3ZlID0gbm9vcGZuOwoJd2luZG93W2dhTmFtZV0gPSBnYTsKfSkoKTs =', потому что он нарушает следующие директивы Content Security Policy: "script -src 'я' https://www.google-analytics.com".
Можно ли использовать этот script из JS файла, и если не так, как мне нужно изменить CSP?
Ответы
Ответ 1
См. ответ Michele Spagnuolo и нажмите вверх.
Это вызвано uBlock Origin, и потому, что data
URL-адреса не указаны в белый список:
script-src data:;
Нет смысла делать это, так как это может привести к уязвимости вашего приложения, если ненадежные данные будут использоваться как URL-адреса в любом месте вашего приложения или если злоумышленник может вводить теги, которые используют такие URL-адреса. Это, конечно, зависит от точки инъекции и символов, которые разрешены.
Конечно, вы должны использовать белый список любых введенных пользователем URL-адресов (например, убедитесь, что они начинаются с http://
или https://
), однако, поскольку CSP является защитой в глубину, вы, вероятно, не хотите слишком сильно ее ослабить.
Результат заключается в том, что вы ослабляете свой CSP, делая это, чтобы предотвратить срабатывание отчета или ошибки CSP.
Ответ 2
Google Analytics совместима с CSP. Записанный base64 data:
blob OP видит, что он вводится расширением uBlock Origin. Чтобы проверить, отключите его/попробуйте инкогнито. IIRC, это связано с настройкой "экспериментального/разрыва" в расширении.
Пожалуйста, сопротивляйтесь соблазну белого списка data:
в script-src
. Это сделало бы политику совершенно бесполезной для смягчения XSS, так как злоумышленник мог просто ввести <script src="data:text/javascript,alert(1)"></script>
для выполнения Javascript.