我有ASP.NET核心应用程序,我正在使用Telerik的ASP.NET核心框架UI来处理某些小部件,如Date,DropDownList,Charts等。
应用程序正在从自己的服务器加载所有javascripts,images,css。所以我已经启用了CSP策略,如下所示
script-src 'self' 'unsafe-eval';
style-src 'self' 'unsafe-inline';
img-src 'self' data:;
font-src 'self';
media-src 'none';
object-src 'none';
child-src https://xxxx.yyyy.com;
report-uri http://myapplication/csp/report;
然而,当页面加载时我看到chrome控制台中的错误
拒绝执行内联脚本,因为它违反了以下内容 内容安全策略指令:“script-src'self''unsafe-eval'”。 一个'unsafe-inline'关键字,一个哈希 ('sha256-oii70XYoqukWS9204nbwatxgYOYcr06 + rftc4egdfUk =')或者一个随机数 ('nonce -...')是启用内联执行所必需的
我正在该页面上使用的几个Kendo小部件重复此错误。例如日期小部件。在cshtml中,我已将日期配置为如下
@(Html.Kendo().DatePicker()
.Name("sbDate")
.HtmlAttributes(new { @class = "mydate" }))
以html格式呈现为
<input class="mydate" id="sbDate" name="sbDate" type="date" value="" /><script>jQuery(function(){jQuery("#sbDate").kendoDatePicker({"format":"M/d/yyyy","footer":false});});</script>
我已经了解了Telerik对CSP的建议here和here。根据建议,我只需添加unsafe-eval
即可使小部件正常工作。但看起来并非如此。我还必须添加unsafe-inline
以使小部件正常工作。
但是,启用CSP的重点是不允许使用内联脚本。
问题
有什么方法可以解决这个问题吗?
更新1
窗口小部件仅适用于IE 11而不添加unsafe-inline
。在chrome和IE edge中,小部件需要unsafe-inline
才能工作。
答案 0 :(得分:0)
我无法确定这是否可以解决您的问题,但在我们的应用程序中,我们使用Deferring功能,但出于其他原因。我们的理由是我们在页面末尾加载所有脚本(尤其是jquery.js
)。但副作用是不再将jQuery
脚本调用呈现到页面中。您可以通过执行@Html.Kendo().DeferredScripts()
来控制地点生成所有脚本(但您可以在上面的文档中找到更多帮助)。无论如何,可能在CSP的上下文中,即使页面最后的<script>
块仍被视为&#34;内联&#34;。但试一试。
答案 1 :(得分:0)
下面的解决方案可能有用(我还没有尝试过)
1&GT;为每个kendo小部件添加Deferred
方法。像
@(Html.Kendo().DatePicker().Name("BeginDate").Deferred())
2 - ;在使用Kendo控件的每个视图中,在底部添加脚本标记
<script asp-add-nonce="true">
@Html.Kendo().DeferredScripts(false)
</script>
请注意,asp-add-nonce
并非从asp.core开箱即用。您必须安装Joonasw.AspNetCore.SecurityHeaders nuget库。我找到了作者的this article,其中展示了如何为.net核心应用程序配置CSP,以及如何为每个请求生成新的随机数。
3&gt;不要在web.config中配置CSP策略,因为我们需要为每个请求使用不同的nonce值,而是使用文章中提到的Joonasw.AspNetCore.SecurityHeaders中间件配置CSP策略。
4&gt;我认为如果我们使用随机unsafe-inline
,我们无需添加nonce
(除非您定位到较旧的浏览器)