我正在寻找一种好方法来为我的 ASP.NET WebForms 应用程序实现相对强大的
Content-Security-Policy
标头。我在文件中存储尽可能多的 JavaScript,而不是内联,但默认情况下,WebForms 会注入大量内联脚本,例如表单提交和基本 AJAX 调用等简单操作。
MVC 有一些简单的方法来实现随机数,特别是在 NWebsec 等第三方库的帮助下,但我似乎找不到任何使用 WebForms 实现它们的方法。如果有一种方法可以预测和检索每个 .NET 注入脚本标记的哈希值,那么使用哈希值我什至不会遇到问题。
我讨厌允许
'unsafe-inline'
值。需要关闭如此强大的安全功能感觉很不对劲。有没有合理的方法在WebForms中实现它?
我也有同样的问题。我很遗憾地说这是我们做得最好的一次。我们基本上确定了我们使用什么和不使用什么。我们甚至不得不在一些指令中添加
unsafe-eval
,因为我们使用的是第三方控件,没有它就无法工作。至少我们避免调用外部网址。
default-src 'self';
child-src 'self' 'unsafe-inline' 'unsafe-eval';
object-src 'none';
script-src 'self' 'unsafe-inline' 'unsafe-eval' https://www.google-analytics.com;
img-src 'self' https://www.google-analytics.com;
style-src 'self' 'unsafe-inline'
我在这里写了一个答案,了解如何处理所有这些注入的脚本:
如果您在 Chrome 中打开开发工具,您可能会看到类似的消息
拒绝执行内联脚本,因为它违反了以下内容安全策略指令:
。需要"script-src 'self'
关键字、哈希 ('unsafe-inline'
) 或随机数 ('sha256-2NqnatcPqy5jjBXalTpZyJMO/0fUaYUb3ePlviUP4II='
) 才能启用内联执行。'nonce-...'
如果您仔细查看该消息,它会告诉您哈希值是什么:
sha256-2NqnatcPqy5jjBXalTpZyJMO/0fUaYUb3ePlviUP4II=
因此,如果您不想走随机数路线,您可以走散列路线并添加
Content-Security-Policy: script-src 'self' 'sha256-2NqnatcPqy5jjBXalTpZyJMO/0fUaYUb3ePlviUP4II=' 'unsafe-eval';
在某些情况下,您可能还需要添加
才能发挥作用。unsafe-eval
让我们从一个简单的例子开始:
<system.webServer>
<httpProtocol>
<customHeaders>
<add name="Content-Security-Policy" value="default-src 'self'" />
</customHeaders>
</httpProtocol>
</system.webServer>
Content-Security-Policy
标头的值由用分号分隔的N段组成。在上面的例子中,我们只指定了一个段,表示“仅从'self'
加载资源”。 'self'
转换为与 HTML 资源相同的来源。通过此最低配置,您的 HTML 可以从提供引用资源的 HTML 的同一域中获取 JavaScript、样式表等。您将无法包含来自 CDN 和类似内容的外部脚本。
假设您自己托管所有内容,但想要包含来自 cdnjs 的 jQuery。您需要以下值来允许浏览器在您的来源之外发出请求:
<add name="Content-Security-Policy" value="default-src 'self' https://cdnjs.cloudflare.com" />
还记得我讲过的片段吗?您可以使用一系列不同的
*-src
键来配置哪些域加载不同类型的资源,如下所示:
<add name="Content-Security-Policy" value="default-src 'self'; script-src 'self' https://cdnjs.cloudflare.com; style-src 'self' https://maxcdn.bootstrapcdn.com" />
此配置让您的 Web 应用程序可以从自己的域加载资源,以及来自 cdnjs.cloudflare.com 的脚本和来自 maxcdn.bootstrapcdn.com 的样式表。
我们也必须收紧
default-src 'none';
script-src 'self' 'unsafe-inline' 'unsafe-eval';
img-src 'self' data:;
style-src 'self' 'unsafe-inline' 'unsafe-eval';
connect-src 'self';
font-src 'self';
frame-ancestors 'none';
此解决方案与 ASP.NET WebForms 配合良好,因为它仍然允许内联(无需将所有内容提取到单独的 js 文件)以及 eval。
在我看来,特别需要不安全标签来提供更好的 WebForms 功能。
要查看您是否需要任何额外/更少的限制,您可以使用: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy