使用 NWebSec 将不同的内容安全策略应用于不同的目录

Applying different Content Security Policies to different directories with NWebSec

我有一个 ASP.NET MVC 网站,该网站使用高度自定义的 Umbraco 6 后端作为该网站的 CMS。

我一直在升级整个网站的内容安全策略 (CSP) headers,我正在使用 NWebsec 进行升级,网站现在愉快地使用 CSP 3 strict-dynamic 和每个脚本标签上都有随机数,一切正常。

不幸的是,我无法将相同的更改应用到 Umbraco 管理区域,所以其中大部分根本不起作用。

所以我想做的是将严格的 CSP 3 政策应用于网站的 public-accessible 部分,并将宽松的 CSP 政策应用于 locked-down 管理区域。

Umbraco 管理区域位于子目录 /umbraco/ 下,所以我认为实现这一点的最佳方法是在站点的 Web.config 文件中使用两个不同的位置元素。

所以我的 Web.config 现在看起来像:

<!-- Specific CSP for Umbraco -->
<location path="~/umbraco">
  <nwebsec>
  ...
  <content-Security-Policy enabled="true">
    ...
    <script-src self="true" unsafeInline="true" unsafeEval="true">
      <add source="data:" />
    </script-src>
    ...
  </content-Security-Policy>
  </nwebsec>
</location>

<!-- default CSP for everything else -->
<location path=".">
  <nwebsec>
  ...
  <content-Security-Policy enabled="true">
    ...
    <script-src self="true" unsafeInline="true" unsafeEval="false" strictDynamic="true">
    </script-src>
    ...
  </content-Security-Policy>
  </nwebsec>
</location>

但这会将默认配置应用于整个站点。

我不确定我的配置是否有误,或者 NWebSec 不支持我正在尝试做的事情,或者重定向或其他方面存在一些特定问题。

通过在 /umbraco 子目录中创建一个单独的 Web.config 来修复。

主要Web.config:

<location path="." allowOverride="true"> <nwebsec> ... <content-Security-Policy enabled="true"> ... <script-src self="false" unsafeInline="true" unsafeEval="false" strictDynamic="true"> <add source="www.example.com" /> </script-src> ... </content-Security-Policy> </nwebsec> </location>

Web.config 在 /umbraco 子目录中:

<location path="." allowOverride="true"> <nwebsec> ... <content-Security-Policy enabled="true"> ... <script-src self="true" unsafeInline="true" unsafeEval="true" strictDynamic="false"> <clear/> <add source="www.other-example.com" /> </script-src> ... </content-Security-Policy> </nwebsec> </location>

子目录中的配置覆盖了主目录 Web.config - 因此 strictDynamic="false" 关闭了对那些 CSP3 随机数的使用,并且清除元素删除了集合中所有预先存在的元素,因此可以使用一组新的域。