如何在IIS中使用nonce进行内容安全策略?

问题描述 投票:9回答:1

我有一个用ASP.NET 4.5.1开发的MVC应用程序。该应用程序在几个页面中使用了javascripts。其中一些 javascripts 被引用为

@Scripts.Render("~/Scripts/bootstrap")
@Scripts.Render("~/Scripts/js")

也有一些内联脚本,如

<script type="javascript">

   // javascript code
</script>

我想实施 Content Security Policy 为本网站。该网站是在IIS中托管的。所以在IIS中,我添加了 content-security-policy 头部 HTTP Response Header 作为

 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 属性只推荐用于内联脚本? 2. 我如何添加随机生成的nonce 变成 script 标签,更重要的是,IIS如何知道随机生成的nonce值,以便它可以包含在响应头中?(我假设每个响应都有唯一的nonce值)

asp.net asp.net-mvc security content-security-policy
1个回答
0
投票
  1. nonce 属性只用于内联脚本。如果你想从其他源头上保证你的源头安全,你可以使用"@Scripts.Render("~Scriptsbootstrap") "属性。hash
  2. IIS默认不提供nonce生成。你需要在后台处理它。

    i. 定义一个帮助程序来生成一个随机的nonce字符串,名为 CreateNonce(). 字符串的长度不是很重要,但你需要确保它是一个唯一的值。所以,如果你定义了一个10-20长度的字母数字字符的字符串,它将会是好的。你将在你的视图中调用这个方法,那里是你的内联脚本,例如:当你调用这个帮助程序时,它将会在你的视图中出现。<script <%CreateNonce()%>当你调用这个助手时,它将返回一个输出,生成nonce值,例如:<script nonce-123abc> 并调用另一个帮助程序,这将在下面的步骤中解释。

    ii. 定义另一个帮助程序来为内联脚本创建CSP规则到响应头,命名为 CSPGenerator(). 当你调用这个方法时,它应该创建一个叫做 Content-Security-Policy 响应头,如果它不存在,它应该将新的nonce值附加到它上面。如果头是存在的,它应该将新的nonce值附加到该头。

伪代码(对不起,我不是asp.net开发者)。

Views.cshtml 

<script <%CreateNonce()%> >

Helpers.cs

Public CreateNonce(){
generateRandomAlphaNumericChars
CSPGenerator('apply-to-csp-rules:generateRandomAlphaNumericChars')
and response.write generateRandomAlphaNumericChars
}

Public CSPGenerator(str nonce_){
GetHttpResponse[csp],
if null, add new response header,
response.header.append="script-src "+ nonce_
}
© www.soinside.com 2019 - 2024. All rights reserved.