Javascript 如何让KendoUI MVC使用内容安全策略
如何避免Telerik KendoUI在使用ASP.NET MVC剑道组件时创建内联脚本 避免内联脚本的原因是遵循CSP头Javascript 如何让KendoUI MVC使用内容安全策略,javascript,asp.net-mvc,kendo-ui,telerik,content-security-policy,Javascript,Asp.net Mvc,Kendo Ui,Telerik,Content Security Policy,如何避免Telerik KendoUI在使用ASP.NET MVC剑道组件时创建内联脚本 避免内联脚本的原因是遵循CSP头 Content-Security-Policy: script-src 'self' 'unsafe-eval' https://kendo.cdn.telerik.com 而且不会出现像这样的错误 拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src‘self’‘safe eval’” 有没有办法删除剑道生成的内联脚本或脚本 是否将内容安全策略no
Content-Security-Policy: script-src 'self' 'unsafe-eval' https://kendo.cdn.telerik.com
而且不会出现像这样的错误
拒绝执行内联脚本,因为它违反了以下内容安全策略指令:“script src‘self’‘safe eval’”
有没有办法删除剑道生成的内联脚本或脚本
是否将内容安全策略nonce/sha256附加到脚本
简单示例(KendoUI菜单)
cshtml
浏览器html
jQuery(function(){jQuery(#nav菜单”).kendoMenu({});});
解决方案 在@dimodi给出答案后,我在剑道延迟初始化脚本上使用了nonce 资料来源: cshtml
@(Html.Kendo().Menu())
.Name(“导航菜单”)
.项目(项目=>
{
items.Add().Text(“主页”).Action(“索引”、“概述”);
})
.递延
)
@Html.Kendo().DeferredScripts(false)
Startup.cs
公共部分类启动
{
公共无效配置(IAppBuilder应用程序)
{
应用程序使用((上下文,下一步)=>
{
var rng=new RNGCryptoServiceProvider();
var nonceBytes=新字节[32];
rng.GetBytes(非字节);
var nonce=Convert.tobase64字符串(非字节);
Set(“ScriptNonce”,nonce);
context.Response.Headers.Add(“内容安全策略”,
新[]{$”脚本src'self''不安全评估'https://kendo.cdn.telerik.com 'nonce-{nonce}'
});
返回next();
});
}
}
公共静态类非帮助器
{
公共静态IHtmlString ScriptNonce(此HtmlHelper帮助程序)
{
var owinContext=helper.ViewContext.HttpContext.GetOwinContext();
返回新的HtmlString(owinContext.Get(“ScriptNonce”);
}
}
您可以控制Kendo UI MVC内联脚本在页面上的呈现位置,但不能完全删除它们。实际上,您可以,但是小部件将不会初始化
考虑使用非MVC剑道UI小部件:
Vanilla HTML/JavaScript Kendo UI小部件提供对初始化脚本放置的完全控制-服务器包装器在小部件的HTML输出之后立即呈现小部件的初始化脚本。即使使用,脚本仍保留在视图中。当使用普通(非包装器)剑道UI小部件时,您可以自己编写初始化脚本,并将它们移动到外部脚本文件中
还要记住,剑道UI模板依赖于
eval
,如果启用CSP,这也会带来问题。您可以控制剑道UI MVC内联脚本在页面上的呈现位置,但无法完全删除它们。实际上,您可以,但是小部件将不会初始化
考虑使用非MVC剑道UI小部件:
Vanilla HTML/JavaScript Kendo UI小部件提供对初始化脚本放置的完全控制-服务器包装器在小部件的HTML输出之后立即呈现小部件的初始化脚本。即使使用,脚本仍保留在视图中。当使用普通(非包装器)剑道UI小部件时,您可以自己编写初始化脚本,并将它们移动到外部脚本文件中
还请记住,剑道UI模板依赖于
eval
,如果启用CSP,这也会带来麻烦。我尝试使用Nuget(5.1.1)的NWebSec CSP包,但无法使其与NWebSec一起工作,剑道MVC(2018.1.322)现在可以工作
将NWebSec作为项目的一部分进行维护,并添加
@在视图中使用NWebsec.Mvc.HttpHeaders.Csp,并在脚本标记中应用HTMLHelper,我会自动为任何内联脚本生成一个nonce,我尝试使用Nuget(5.1.1)的NWebsec Csp包,但无法使其与NWebsec一起工作,Kendo Mvc(2018.1.322)现在可以工作 将NWebSec作为项目的一部分进行维护,并添加
@在视图中使用NWebsec.Mvc.HttpHeaders.Csp,并在脚本标记中应用HTMLHelper,我会自动为任何内联脚本生成一个nonce',对于2019年搜索该脚本的任何人,我们在Csp中使用Joonasw.AspNetCore.SecurityHeaders,kendo使用的是阻塞eval(),我们通过将其添加到启动中解决了这一问题
app.UseCsp(csp =>
{
...
csp.AllowScripts
.FromSelf()
.From("kendo.cdn.telerik.com")
.AllowUnsafeInline()
.AllowUnsafeEval();
...
}
对于2019年搜索这个的人,我们在Csp中使用Joonasw.AspNetCore.SecurityHeaders,kendo使用的是阻塞eval(),我们通过将它添加到我们的启动中解决了这个问题
app.UseCsp(csp =>
{
...
csp.AllowScripts
.FromSelf()
.From("kendo.cdn.telerik.com")
.AllowUnsafeInline()
.AllowUnsafeEval();
...
}
谢谢你的回复谢谢你的回复
@(Html.Kendo().Menu()
.Name("nav-menu")
.Items(items =>
{
items.Add().Text("Home").Action("Index", "Overview");
})
.Deferred()
)
<script type="text/javascript" nonce="@Html.ScriptNonce()">
@Html.Kendo().DeferredScripts(false)
</script>
public partial class Startup
{
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[] {$"script-src 'self' 'unsafe-eval' https://kendo.cdn.telerik.com 'nonce-{nonce}';"
});
return next();
});
}
}
public static class NonceHelper
{
public static IHtmlString ScriptNonce(this HtmlHelper helper)
{
var owinContext = helper.ViewContext.HttpContext.GetOwinContext();
return new HtmlString(owinContext.Get<string>("ScriptNonce"));
}
}
app.UseCsp(csp =>
{
...
csp.AllowScripts
.FromSelf()
.From("kendo.cdn.telerik.com")
.AllowUnsafeInline()
.AllowUnsafeEval();
...
}