如何解决NWebSec 非 MVC WebForms ASPX .Net 4.6.1 C# - 配置不起作用
我需要支持在 Asp.net、C# 和 .NET 4.6.1 上运行的旧网站。安全审计通知我们,我们需要执行内容安全策略。我已经搜索过谷歌,但没有找到关于 NWebSec 中是否支持 webforms(而不是 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 webforms 的支持,我按照以下步骤操作:
-
使用 .net 4.6.1 在 VS 2017 中创建了一个新的 Asp.net webforms 项目。经测试有效。
-
添加了此处指定的 NuGet 包 - https://www.nuget.org/packages/NWebsec/:Install-Package NWebsec -Version 6.0.0
-
更改了 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-...')。 任何帮助/指针/支持表示赞赏。
解决方法
<script type="text/javascript"> ... </script>
是内联脚本,因此您可以选择在 CSP 中允许它:
-
将
'unsafe-inline'
令牌添加到script-src
中:<add source="'unsafe-inline'" />
是的,它不安全并且会降低 CSP 的有效性 -
将三个
'hash-sources'
添加到script-src
因为您有 3 个内联脚本(这适用于<script>
内联块,但在<tag onclick='...'
或 {{1 }} 内联脚本):<a href='javascript:...'
<add source="'sha256-AJipRK0+ga273yKzZZX3BqTHwvwc1v3R9erdu31Wh6I=' />
<add source="'sha256-2vr5KMButMK7a+bOf/ned/cPnF2yNooMulXA8E65wGw=' />
-
使用 'nonce-value'(它不适合像 SPA 这样的客户端渲染应用程序,因为您无法在每个页面加载时生成一个新的随机数):
<add source="'sha256-uYoAmCrBFM4tx/Ww+6eFuIJxuwZ3YFRT7fWUTlgnPuE=' />
-
将内联
<script type="text/javascript" nonce="server_generated_base64_value"> ... /script>
的内容移动到外部文件并使用<script>
允许它。
您可以使用 addEventListener() 代替内联'self'
。
您可以使用<tag onclick='..'>
代替内联<a href='javascript:...'>
。
还有与上面相同的内容,但使用内联 <a href='#'>
或 <style>
:
modernizr-2.8.3.js:134 拒绝应用内联样式,因为它违反了以下内容安全策略指令:“style-src 'self'”
因此,您具有与上述相同的选项,但对于 <tag style='...'
指令:style-src
这适用于内联 <add source="'sha256-CwE3Bg0VYQOIdNAkbB/Btdkhul49qZuwgNCMPgNY5zw=' />
但因 <style>
而失败。
PS:如您所见,有 3 种“内联脚本”和 2 种“内联样式”。并且在修改 CSP 规则之前,您需要知道其中使用了哪些。并且 JS 调用 <tag style='...'
也算作内联 样式,会被 CSP 阻止。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。