启用CSP后,Kendo小部件无效

时间:2017-03-14 16:30:31

标签: security kendo-ui kendo-asp.net-mvc content-security-policy

我有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的建议herehere。根据建议,我只需添加unsafe-eval即可使小部件正常工作。但看起来并非如此。我还必须添加unsafe-inline以使小部件正常工作。

但是,启用CSP的重点是不允许使用内联脚本。

问题
有什么方法可以解决这个问题吗?

更新1
窗口小部件仅适用于IE 11而不添加unsafe-inline。在chrome和IE edge中,小部件需要unsafe-inline才能工作。

2 个答案:

答案 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(除非您定位到较旧的浏览器)