Content-Security-Policy in ASP.NET WebForms

43

我正在寻找一种良好的方法来为我的ASP.NET WebForms应用程序实现相对强大的Content-Security-Policy标头。我将尽可能多地将JavaScript存储在文件中而不是内联,但默认情况下,WebForms会注入大量的内联脚本 - 甚至是像表单提交和基本AJAX调用这样简单的功能也会受到影响。

与MVC相比,WebForms似乎没有实现nonce的简单方法,即使使用第三方库如NWebsec也无法实现。如果有一种预测并检索每个.NET注入脚本标记的哈希值的方法,我甚至不会使用哈希值。

我讨厌允许'unsafe-inline'值。关闭这样一个强大的安全功能感觉不对。在WebForms中是否有合理的方法来实现它呢?


我没有。我甚至试图在Twitter上寻求Troy HuntAndré Klingsheim的帮助,但都没有成功。 - Andy
4个回答

13

我曾经遇到过同样的问题。很遗憾,这是我们所做的最好的办法了。我们基本上确定了我们使用和不使用的内容。我们甚至不得不在某些指令中加入unsafe-eval,因为我们使用了一些不能在没有它的情况下正常工作的第三方控件。至少我们避免了对外部URL的调用。

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'

这些 CSP 标头可以写在 Web 表单主页面的元标记中吗? - VimalSingh

8

我在这里写了一个答案,讲述了如何处理所有注入的脚本:点此查看

If you open up the dev tools in Chrome, you'll likely see a message like

Refused to execute inline script because it violates the following Content Security Policy directive: "script-src 'self'. Either the 'unsafe-inline' keyword, a hash ('sha256-2NqnatcPqy5jjBXalTpZyJMO/0fUaYUb3ePlviUP4II='), or a nonce ('nonce-...') is required to enable inline execution.

If you look carefully at that message, it's telling you what the hash would be: sha256-2NqnatcPqy5jjBXalTpZyJMO/0fUaYUb3ePlviUP4II=

So if you don't want to go the nonce route, you can instead go the hash route and add

Content-Security-Policy: script-src 'self' 'sha256-2NqnatcPqy5jjBXalTpZyJMO/0fUaYUb3ePlviUP4II=' 'unsafe-eval';

You may have to add unsafe-eval in some cases as well for this to work.


这些 CSP 标头可以写在 WebForms 主页面的元标记中吗? - VimalSingh

1

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

<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 从提供引用资源的同一域获取 JavaScript、样式表等。您将无法从 CDNs 和类似网站中包含外部脚本。

假设您将所有内容都托管在自己的服务器上,但要从 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 加载样式表。


4
这个回答没有涉及问题的核心观点:ASP.Net在页面中插入_内联脚本_来实现其功能。提问者已经知道了CSP的作用,他想让平台在不使用unsafe-inline的情况下正常运行。 - Michael

0

我们还需要收紧

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's。

在我看来,Unsafe-Tags特别需要提供更好的WebForms功能。

要查看是否需要任何其他/较少的限制,您可以使用: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接