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

标签 asp.net asp.net-mvc security content-security-policy

我在 ASP.NET 4.5.1 中开发了 MVC 应用程序。该应用程序在多个页面中使用 javascript。一些 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>

因此,每个响应都将包含此 header 。

问题
1.应该nonce属性只推荐用于内联脚本?
2. 如何添加随机生成的nonce进入 script标签,重要的是 IIS 如何知道随机生成的 nonce 值,以便它可以包含在响应 header 中? (我假设每个响应都具有唯一的 nonce 值)

最佳答案

  • nonce属性仅用于内联脚本。如果您想从其他来源保护您的来源,您可以使用 hash
  • IIS 默认不提供 nonce 生成。您需要在后端处理它。

    一世。定义一个 helper 来生成一个随机的 nonce 字符串,命名为 CreateNonce() .字符串长度不是那么重要,但您需要确保它是一个唯一值。所以,如果你用字母数字字符定义一个 10-20 长度的字符串,那就没问题了。您将在您的 View 上调用此方法,您的内联脚本在哪里。例如:<script <%CreateNonce()%>当你调用这个助手时,它会返回一个生成 nonce 值的输出,例如。 <script nonce-123abc>并调用另一个助手,这在以下步骤中进行了解释。

    ii.定义另一个助手来为内联脚本的响应头创建 CSP 规则,命名为 CSPGenerator() .当你调用这个方法时,它应该创建一个 Content-Security-Policy如果响应头不存在。如果头存在,它应该附加新的 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_
    }
    

    关于asp.net - 如何在 IIS 中使用 nonce 进行内容安全策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42770650/

    相关文章:

    c# - 在 ASP.NET core 中从类库加载和注册 API Controller

    c# - ASP.net MVC - 用于 POST 操作的单独 ViewModel

    c# - 如何显示 ActionLink |象征

    c# - MVC 4 : How to maintain sessions and cookies to be still valid after IIS restart?

    javascript - 如何使用 Jquery 在 ASP.Net 中制作对话框?

    flutter - Flutter应用程序中是否可以从nfc芯片读取护照数据?

    asp.net - 如何安全地向所有 ASP.NET AJAX HTTPS 响应添加随机填充?

    security - Elasticsearch 从哪里获取 elasticsearch-keystore 密码?

    html - 发布新图像时确保图像不会在客户端浏览器中兑现的最佳方法是什么?

    c# - 如何为现有 WCF 服务原生启用 JSONP?