0

我需要支持在 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

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

  1. 使用 .net 4.6.1 在 VS 2017 中创建了一个新的 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 框架注入到 aspx 页面中


<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 -...')。任何帮助/指针/支持表示赞赏。

4

1 回答 1

0

<script type="text/javascript"> ... </script>是一个内联脚本,因此您有几个选项可以在 CSP 中允许它:

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

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

  3. 使用“nonce-value”(它不适合 SPA 等客户端渲染应用程序,因为您无法在每个页面加载时生成新的 nonce):
    <script type="text/javascript" nonce="server_generated_base64_value"> ... /script>

  4. 将 inline 的内容移动<script>到外部文件并使用'self'. 您可以使用addEventListener()
    代替内联。 而不是内联,您可以使用.<tag onclick='..'>
    <a href='javascript:...'><a href='#'>

您也有与上面相同的内容,但使用内联<style><tag style='...'modernizr-2.8.3.js:134 拒绝应用内联样式,因为它违反了以下内容安全策略指令:“style-src 'self'”
因此你有相同的选择如上所述,但对于style-src指令:
<add source="'sha256-CwE3Bg0VYQOIdNAkbB/Btdkhul49qZuwgNCMPgNY5zw=' />
这适用于 inline<style>但失败<tag style='...'.

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

于 2021-01-07T08:44:07.047 回答