如何使用CSP(内容安全策略)将WebForms项目中动态创建的脚本列入白名单?

时间:2019-01-08 15:59:44

标签: webforms content-security-policy scriptmanager nonce

是否存在使用CSP(内容安全策略)将WebForms项目中动态创建的脚本列入白名单的安全方法?

像下面一样使用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 :(得分:0)

动态脚本没有“安全内联”之类的东西,请尝试使用动态导入吗? (您可以在代码中重新加载此类脚本)。

您通常不必使用'unsafe-inline',这经常成为问题的两件事是开发中的实时重载和代码中的setTimeout / setInterval,它们可以轻松触发CSP。因此最好在开发中禁用CSP以提高交付速度。 “ unsafe-inline”用于启用动态创建的脚本。

更新

要解决此问题,您需要使用标准(可能带有async / defer)<script src="/myscript.js"></script>加载自定义脚本,并且取消了“不安全内联”要求。但是,您的技术选择(“网络表单”)可能会限制您的选择。无论如何要进行测试,请使用CDN URL或单独的服务器(内部或外部)来交付脚本。我已经使用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>

来自related SO question

  

如果modernizr正在注入所有内联东西,而您似乎选择要么(a)添加所有这些散列,(b)使用'unsafe-inline'(但基本上违背了CSP的全部目的……),或(c)不要使用modernizr。

该问题的答案是:从modernizr中删除“内联内容”。您始终可以使用外部库中的document.body.style = "background: #000000;";来设置样式(或其他)属性。我在导入的外部脚本中尝试了所有“常规”代码活动,但它不会触发CSP。通常,我还指将对象(功能)分配给窗口对象并执行它们。

寻找* .createElement(“ script”)或类似内容,因为这肯定会触发CSP。