iis 如何在ASP.NET MVC 4中使用动态随机数

5jvtdoz2  于 2023-02-23  发布在  .NET
关注(0)|答案(2)|浏览(156)

我有在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值)

iovurdzv

iovurdzv1#

插入nonce标签,特别是在CSP中匹配它们通常是很棘手的。如果你的脚本代码是静态的,不包含任何更改,那么根据它们的哈希值将它们列入白名单会容易得多。如果你删除“unsafe-inline”,许多浏览器会告诉你需要添加哪些哈希值。
请注意,您的script-src包括https:和http:将允许它加载http和https上的任何脚本。如果您的页面是通过https提供的,则不允许活动混合内容,因此http上的脚本将不会加载。

iaqfqrcu

iaqfqrcu2#

使用OWIN中间件,您可以非常容易地将头注入ASP.NET MVC 5。一旦设置了OWIN启动(请参见https://learn.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-startup-class-detection),您可以将以下代码添加到启动中以生成动态CSP头:

public void Configuration(IAppBuilder app)
{
    app.Use((context, next) =>
    {
        var rng = new RNGCryptoServiceProvider();
        var nonceBytes = new byte[32];
        rng.GetBytes(nonceBytes);
        var nonce = Convert.ToBase64String(nonceBytes);
        context.Set("ScriptNonce", nonce);
        context.Response.Headers.Add("Content-Security-Policy",
            new[] {string.Format("script-src 'self' 'nonce-{0}'", nonce)});
        return next();
    });
    //Other configuration...
}

然后你可以添加下面的HTML助手来在你的剃刀视图中使用它:

public static class NonceHelper
{
    public static IHtmlString ScriptNonce(this HtmlHelper helper)
    {
        var owinContext = helper.ViewContext.HttpContext.GetOwinContext();
        return new HtmlString(owinContext.Get<string>("ScriptNonce"));
    }
}

然后在视图中使用此辅助对象:

<script type="text/javascript" nonce="@Html.ScriptNonce()">
    //my script body
</script>

渲染结果如下所示:

<script type="text/javascript" nonce="WpvQQK0FO/ZAljsQDGMLEgi2hrvIBVPQNak9zIWqRZE=">
    //my script body
</script>

请注意,如果攻击者可以影响脚本元素的主体,随机数就帮不了你,而哈希可以防止这种情况。然而哈希也有自己的缺点,比如HTTP头膨胀,并且更脆弱。
Here the original reference link .

相关问题