【问题标题】:Kendo widgets does not work when CSP is enabled启用 CSP 时,Kendo 小部件不起作用
【发布时间】:2017-08-05 02:43:42
【问题描述】:

我有 ASP.NET Core 应用程序,我正在使用 Telerik 的 UI for ASP.NET Core 框架来处理某些小部件,如 Date、DropDownList、Charts 等。

应用程序正在从自己的服务器加载所有 javascript、图像、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 边缘小部件中需要 unsafe-inline 才能工作。

【问题讨论】:

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


    【解决方案1】:

    下面的解决方案可能有效(我还没有尝试过)

    1> 为每个剑道小部件添加Deferred 方法。喜欢

        @(Html.Kendo().DatePicker().Name("BeginDate").Deferred())
    

    2>在每个使用剑道控制的视图中,在底部添加脚本标签

      <script asp-add-nonce="true">
          @Html.Kendo().DeferredScripts(false)
      </script>
    

    请注意,asp-add-nonce 并非来自 asp.core 的开箱即用。您必须安装Joonasw.AspNetCore.SecurityHeaders nuget 库。我从作者那里找到了this article,它展示了如何为 .net 核心应用程序配置 CSP,以及如何为每个请求生成新的随机数。

    3>不要在 web.config 中配置 CSP 策略,因为我们需要为每个请求提供不同的 nonce 值,而是使用文章中提到的Joonasw.AspNetCore.SecurityHeaders 中间件配置 CSP 策略。

    4>如果我们使用随机的nonce,我认为我们不需要添加unsafe-inline(除非您针对的是旧版浏览器)

    【讨论】:

      【解决方案2】:

      我无法确定这是否能解决您的问题,但在我们的应用程序中,我们正在使用 Deferring 功能,但出于其他原因。我们的原因是我们在页面末尾加载了所有脚本(尤其是jquery.js)。但副作用是不再将jQuery 脚本调用呈现到页面中。您可以通过执行@Html.Kendo().DeferredScripts() 来控制生成所有脚本的位置(但您会在上面的文档中找到更多帮助)。无论如何,可能在 CSP 的上下文中,即使页面末尾的 &lt;script&gt; 块仍被视为“内联”。不过试试看吧。

      【讨论】:

      • 谢谢。我发现这里的 SO 帖子甚至不同都行不通,因为脚本保留在视图中。 stackoverflow.com/questions/39125743/… 但是我们可以在脚本标签内同时使用不同的脚本,并且可以在 CSP 的脚本标签上使用 nonce
      猜你喜欢
      • 2019-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-21
      • 2014-11-02
      • 1970-01-01
      相关资源
      最近更新 更多