我有在ASP.NETMVC4中开发的MVC应用程序。我在几个页面中使用了JavaScript。一些JavaScript被引用为
@Scripts.Render("~/Scripts/bootstrap")
@Scripts.Render("~/Scripts/js")
还有一些内联脚本,如
<script type="javascript">
// javascript code
</script>
我想实现此网站的内容安全策略。此网站托管在IIS中。因此,在IIS中,我在HTTP响应标头中添加content-security-policy标头作为
object-src 'none';
script-src 'nonce-{random}' 'unsafe-inline' 'unsafe-eval' 'strict-dynamic' https: http:;
base-uri 'self';
report-uri https://csp.withgoogle.com/csp/<unique_id>/<application_version>
所以每个响应都会包含这个头。
问题:
1.我如何添加随机生成的nonce到脚本标记,重要的是IIS如何知道随机生成的nonce值,以便它可以包括在响应头?(我假设每个响应将有唯一的nonce值)
2条答案
按热度按时间iovurdzv1#
插入nonce标签,特别是在CSP中匹配它们通常是很棘手的。如果你的脚本代码是静态的,不包含任何更改,那么根据它们的哈希值将它们列入白名单会容易得多。如果你删除“unsafe-inline”,许多浏览器会告诉你需要添加哪些哈希值。
请注意,您的script-src包括https:和http:将允许它加载http和https上的任何脚本。如果您的页面是通过https提供的,则不允许活动混合内容,因此http上的脚本将不会加载。
iaqfqrcu2#
使用OWIN中间件,您可以非常容易地将头注入ASP.NET MVC 5。一旦设置了OWIN启动(请参见https://learn.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-startup-class-detection),您可以将以下代码添加到启动中以生成动态CSP头:
然后你可以添加下面的HTML助手来在你的剃刀视图中使用它:
然后在视图中使用此辅助对象:
渲染结果如下所示:
请注意,如果攻击者可以影响脚本元素的主体,随机数就帮不了你,而哈希可以防止这种情况。然而哈希也有自己的缺点,比如HTTP头膨胀,并且更脆弱。
Here the original reference link .