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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用CSP(内容安全策略)在WebForms项目中将动态创建的脚本列入白名单?相关的知识,希望对你有一定的参考价值。

是否有使用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'关键字,散列或nonce。

enter image description here

答案

动态脚本没有“安全内联”的功能,尝试使用动态导入? (你可以在代码中重新加载这样的脚本)..

您通常不必使用'unsafe-inline',两个经常出现问题的事情是开发中的实时重载和代码中的setTimeout / setInterval,它们可以轻松触发CSP。因此,最好只在开发中禁用CSP以提高交付速度。 'unsafe-inline'是为了能够执行动态创建的脚本。

更新

要解决此问题,您需要使用标准(可能使用async / defer)<script src="/myscript.js"></script>加载自定义脚本,并且“unsafe-inline”要求消失。但是,您的技术选择(“webforms”)可能会限制您选择这样做。无论如何要进行测试,请使用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。

以上是关于如何使用CSP(内容安全策略)在WebForms项目中将动态创建的脚本列入白名单?的主要内容,如果未能解决你的问题,请参考以下文章

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过

Security ❀ CSP Bypass 内容安全策略绕过

Content Security Policy (CSP) 内容安全策略总结,及抵御 XSS 攻击

当我有两个 CSP(内容安全策略)策略 - 标头和元时会发生啥?

内容安全策略 (csp) 随机数:随机数应该多长时间或多复杂