ASP.NET WebForms 中的内容安全策略

问题描述 投票:0回答:4

我正在寻找一种好方法来为我的 ASP.NET WebForms 应用程序实现相对强大的

Content-Security-Policy
标头。我在文件中存储尽可能多的 JavaScript,而不是内联,但默认情况下,WebForms 会注入大量内联脚本,例如表单提交和基本 AJAX 调用等简单操作。

MVC 有一些简单的方法来实现随机数,特别是在 NWebsec 等第三方库的帮助下,但我似乎找不到任何使用 WebForms 实现它们的方法。如果有一种方法可以预测和检索每个 .NET 注入脚本标记的哈希值,那么使用哈希值我什至不会遇到问题。

我讨厌允许

'unsafe-inline'
值。需要关闭如此强大的安全功能感觉很不对劲。有没有合理的方法在WebForms中实现它?

asp.net webforms content-security-policy
4个回答
14
投票

我也有同样的问题。我很遗憾地说这是我们做得最好的一次。我们基本上确定了我们使用什么和不使用什么。我们甚至不得不在一些指令中添加

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'

10
投票

在这里写了一个答案,了解如何处理所有这些注入的脚本:

如果您在 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
才能发挥作用。


4
投票

让我们从一个简单的例子开始:

<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 的样式表。


3
投票

我们也必须收紧

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

© www.soinside.com 2019 - 2024. All rights reserved.