Как внести в белый список динамически созданные сценарии в проекте WebForms с использованием CSP (Content Security Policy)? - PullRequest
0 голосов
/ 08 января 2019

Существует ли безопасный способ внесения в белый список динамически создаваемых сценариев в проекте WebForms с использованием CSP (Content Security Policy)?

Использование unsafe-inline, как показано ниже, работает, но не рекомендуется.

context.Response.Headers.Append("Content-Security-Policy", string.Format("default-src 'none'; connect-src 'self'; font-src 'self'; img-src 'self' data: https:; style-src 'self'; script-src 'self' 'unsafe-inline'"));

Для любых других опций, таких как nonce-(random), мы видим это сообщение об ошибке CSP:

Отказался выполнять встроенный скрипт, потому что он нарушает следующее Директива политики безопасности контента: "script-src 'self'". Либо Для включения требуется ключевое слово unsafe-inline, хеш или одноразовый номер встроенное исполнение.

enter image description here

1 Ответ

0 голосов
/ 16 января 2019

Для динамических сценариев не существует понятия «безопасный встроенный», попробуйте вместо него использовать динамический импорт? (вы можете перезагрузить такой скрипт в коде) ..

Обычно вам не нужно использовать «unsafe-inline», две вещи, которые часто становятся проблематичными, это живая перезагрузка в разработке и setTimeout / setInterval в вашем коде, они могут легко запускать CSP. Поэтому лучше просто отключить CSP в разработке, чтобы увеличить скорость доставки. «unsafe-inline» - включить выполнение динамически создаваемых сценариев.

Обновление

Чтобы решить эту проблему, вам нужно загрузить собственный скрипт, используя стандартные (возможно, с помощью async / defer) <script src="/myscript.js"></script> и требование «unsafe-inline» отпадает. Тем не менее, ваш выбор технологии («веб-формы») может ограничить ваши возможности сделать это. В любом случае, для доставки сценария используйте URL-адрес cdn или отдельный сервер (внутренний или внешний). Я проверил это локально с помощью nodejs, и он работает как ожидалось. «Проблема», с которой вы столкнулись, вероятнее всего связана с тем, что вы пишете такой код (или код помещается туда):

<script>function unsafeInline() { ... }</script>

Modernizr теперь v3.6.0, вы используете v2.8.3, и чтобы устранить ошибку, вы можете добавить это в свой заголовок:

<header>
  <title>CSP Test</title>
  <meta http-equiv="Content-Security-Policy" content="default-src 'self'; script-src 'self' https://cdnjs.cloudflare.com/;">
  <script src="https://cdnjs.cloudflare.com/ajax/libs/modernizr/2.8.3/modernizr.min.js"></script>
</header>

Из связанного SO вопроса :

Если modernizr внедряет все эти встроенные вещи, чем кажется, что вы выбираете либо (a) добавить все эти хеши, (b) использовать «unsafe-inline» (но в основном это наносит ущерб всей цели CSP…), или (с) не используйте modernizr.

Ответ на этот вопрос таков: удалите «inline stuff» из modernizr. Вы всегда можете использовать document.body.style = "background: #000000;"; из внешней библиотеки, чтобы установить стиль (или другие) атрибуты. Я попробовал все "нормальные" действия кода в импортированном внешнем скрипте, и он не вызывает CSP. Под нормальным я также подразумеваю назначение объектов (функций) объекту окна и их выполнение.

Ищите * .createElement ("script") или аналогичный, поскольку это наверняка вызовет CSP.

...