Политика безопасности контента 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.