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

2024-01-03

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

Using 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”关键字、哈希值或随机数才能启用 内联执行。


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

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

Update

为了解决这个问题,您需要使用标准加载自定义脚本(可能使用异步/延迟)<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>

From a 相关SO问题 https://stackoverflow.com/questions/51300220/what-is-the-current-best-practice-for-using-content-security-policy-with-moderni:

如果 Modernizr 正在注入所有内联内容,那么您的选择似乎是(a)添加所有这些哈希值,(b)使用“不安全内联”(但这基本上破坏了 CSP 的整个目的......),或(c )不要使用modernizr。

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

寻找 *.createElement("script") 或类似的,因为这肯定会触发 CSP。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐