【问题标题】:NWebSec Non-MVC WebForms ASPX .Net 4.6.1 C# - configuration not workingNWebSec 非 MVC WebForms ASPX .Net 4.6.1 C# - 配置不起作用
【发布时间】:2021-04-11 11:07:48
【问题描述】:

我需要支持在 Asp.net、C# 和 .NET 4.6.1 上运行的旧网站。安全审计通知我们,我们需要执行内容安全政策。我搜索了谷歌,但没有找到关于 NWebSec 中是否支持网络表单(不是 MVC)的具体答案。 https://docs.nwebsec.com/en/latest/ 确实提到了对 Asp.net 4 的支持,如下所示:

NWebsec for ASP.NET 4
Historically, NWebsec has been targeting ASP.NET 4. The following packages target ASP.NET 4:

NWebsec
NWebsec.Mvc
NWebsec.Owin

为了测试 NWebSec 对 asp.net 网络表单的支持,我按照以下步骤操作:

  1. 在 VS 2017 中使用 .net 4.6.1 创建了一个新的 Asp.net webforms 项目。测试它工作正常。

  2. 添加了此处指定的 NuGet 包 - https://www.nuget.org/packages/NWebsec/: Install-Package NWebsec -Version 6.0.0

  3. 更改了 Web.config 文件以包含以下内容:

<nwebsec> 
<httpHeaderSecurityModule xmlns="http://nwebsec.com/HttpHeaderSecurityModuleConfig.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="NWebsecConfig/HttpHeaderSecurityModuleConfig.xsd"> 
<securityHttpHeaders> 
<content-Security-Policy enabled="true"> 
<default-src self="true"/> 
<script-src self="true" enabled="true"> 
<add source="maxcdn.bootstrapcdn.com" /> 
<add source="code.jquery.com" /> 
<add source="ajax.googleapis.com" /> 
<!--<add source ="localhost:60252"/>--> 
</script-src> 
<style-src self="true" /> 
<report-uri enableBuiltinHandler="true"/> 
</content-Security-Policy> 
</securityHttpHeaders> 
</httpHeaderSecurityModule> 
</nwebsec>

4.保存并运行项目。

5.Google Chrome 控制台出现以下错误

`modernizr-2.8.3.js:134 拒绝应用内联样式,因为它违反了以下内容安全策略指令:“style-src 'self'”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-CwE3Bg0VYQOIdNAkbB/Btdkhul49qZuwgNCMPgNY5zw=”)或随机数(“nonce-...”)。

localhost/:20 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' maxcdn.bootstrapcdn.com code.jquery.com ajax.googleapis.com”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-uYoAmCrBFM4tx/Ww+6eFuIJxuwZ3YFRT7fWUTlgnPuE=”)或随机数(“nonce-...”)。

localhost/:39 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' maxcdn.bootstrapcdn.com code.jquery.com ajax.googleapis.com”。启用内联执行需要使用“unsafe-inline”关键字、哈希(“sha256-2vr5KMButMK7a+bOf/ned/cPnF2yNooMulXA8E65wGw=”)或随机数(“nonce-...”)。

localhost/:52 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script-src 'self' maxcdn.bootstrapcdn.com code.jquery.com ajax.googleapis.com”。启用内联执行需要“unsafe-inline”关键字、哈希(“sha256-AJipRK0+ga273yKzZZX3BqTHwvwc1v3R9erdu31Wh6I=”)或随机数(“nonce-...”)。`

例如,在 Chrome 控制台中单击粗体错误会导致以下 JavaScript 块被 Asp.net 框架注入到 asp 页面中


<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['ctl01'];
if (!theForm) {
    theForm = document.ctl01;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>

我希望看到这些 Google 控制台错误消失,但是,我不想允许使用“unsafe-inline”关键字或使用哈希 ('sha256-uYoAmCrBFM4tx/Ww+6eFuIJxuwZ3YFRT7fWUTlgnPuE=') 或随机数('nonce-...')。 任何帮助/指针/支持表示赞赏。

【问题讨论】:

    标签: javascript asp.net webforms content-security-policy nwebsec


    【解决方案1】:

    &lt;script type="text/javascript"&gt; ... &lt;/script&gt; 是一个内联脚本,因此您可以选择在 CSP 中允许它:

    1. 'unsafe-inline' 令牌添加到script-src:
      &lt;add source="'unsafe-inline'" /&gt;
      是的,它不安全并降低了 CSP 的有效性

    2. 将三个 'hash-sources' 添加到 script-src 中,因为您有 3 个内联脚本(这适用于 &lt;script&gt; 内联块,但在 &lt;tag onclick='...'&lt;a href='javascript:...' 内联脚本的情况下失败):
      &lt;add source="'sha256-AJipRK0+ga273yKzZZX3BqTHwvwc1v3R9erdu31Wh6I=' /&gt;&lt;add source="'sha256-2vr5KMButMK7a+bOf/ned/cPnF2yNooMulXA8E65wGw=' /&gt;
      &lt;add source="'sha256-uYoAmCrBFM4tx/Ww+6eFuIJxuwZ3YFRT7fWUTlgnPuE=' /&gt;

    3. 使用 'nonce-value'(它不适合 SPA 等客户端渲染应用,因为您无法在每个页面加载时生成新的随机数):
      &lt;script type="text/javascript" nonce="server_generated_base64_value"&gt; ... /script&gt;

    4. 将内联 &lt;script&gt; 的内容移动到外部文件并使用 'self' 允许它。
      您可以使用 addEventListener() 而不是内联 &lt;tag onclick='..'&gt;
      您可以使用 &lt;a href='#'&gt; 代替内联 &lt;a href='javascript:...'&gt;

    你也有与上面相同但内联的&lt;style&gt;&lt;tag style='...'modernizr-2.8.3.js:134 拒绝应用 内联样式,因为它违反了以下内容安全策略指令:“style-src 'self'”
    因此,您具有与上述相同的选项,但对于 style-src 指令:
    &lt;add source="'sha256-CwE3Bg0VYQOIdNAkbB/Btdkhul49qZuwgNCMPgNY5zw=' /&gt;
    这在内联&lt;style&gt; 的情况下有效,但在&lt;tag style='...' 失败。

    PS:如您所见,有 3 种“内联脚本”和 2 种“内联样式”。在修改 CSP 规则之前,您需要知道使用了哪些。并且JS调用setAttribute('style', ...)也算作内联style,会被CSP拦截。

    【讨论】:

    • 我特别不想使用我在帖子中提到的选项 1,2 和 3。 'unsafe-inline' 会使代码不安全。哈希源和随机数是不实用的。 Webforms 嵌入脚本的哈希是不可预测的,并且可能会随着部署环境而改变。目前没有办法将 nonce 传递给 web 表单中的动态嵌入脚本。我不能执行选项 4,因为 JS 块是由 webforms 动态注入的。编译时没有 JS 脚本可供我分离到它自己的文件中。谢谢。
    • 请查看Customize web form script generation,其中包含一个技巧,可以覆盖__DoPostBack 或覆盖CreateHtmlTextWriter。最后一个允许在脚本中插入nonce= 属性
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 1970-01-01
    相关资源
    最近更新 更多