【问题标题】:Active Content-Security-Policy (CSP) and Rails :back linkActive Content-Security-Policy (CSP) 和 Rails :back link
【发布时间】:2016-11-01 03:20:30
【问题描述】:

我想通过活动的 Content-Security-Policy 为我的应用程序启用内部 Rails :back 链接功能。

CSP:

%meta{"http-equiv" => "Content-Security-Policy", "content" => "default-src *;"}

示例链接:

= link_to 'Back', :back
# <a href="javascript:history.back()">Back</a> *

* Rails 链接到引用者,并且只有在没有设置引用者时才回退到 JS。

我怎样才能只将这个很小的history.back() javascript 列入白名单?

我尝试按照https://www.w3.org/TR/2015/CR-CSP2-20150721/#script-src-hash-usage 中所述设置异常并生成所需的哈希,如下所示:

echo -n "history.back()" | openssl dgst -sha256 -binary | openssl enc -base64

结果:

%meta{"http-equiv" => "Content-Security-Policy", "content" => "default-src *; script-src 'self' 'sha256-LdlORHyUW/rwezK0l13nW+IwcZmi78eWOCBjewMWRr4='"}

但 Chrome 控制台显示相同的错误,这意味着哈希无效:

拒绝执行 JavaScript URL,因为它违反了以下内容 内容安全策略指令:“script-src 'self' 'sha256-SmahML3R6+R4SRnsB6tEJ8Z4OVa4Qhk7A/gv3eAiG6s='”。 'unsafe-inline' 关键字、哈希 ('sha256-...') 或随机数 ('nonce-...') 是启用内联执行所必需的。

【问题讨论】:

    标签: javascript ruby-on-rails ruby-on-rails-4 content-security-policy


    【解决方案1】:

    您还可以将 JS 移动到服务器上的外部文件中,并将其包含在 &lt;script src=...&gt; 中。您的 CSP 允许 *,因此也允许您自己的来源('self')。然后使用不显眼的 JavaScript 对链接的点击做出反应。想法是这样的:http://guides.rubyonrails.org/working_with_javascript_in_rails.html#unobtrusive-javascript

    【讨论】:

    • 不幸的是,这并不能解决我的问题,因为反向链接的 html 代码和 javascript 是由 Rails 生成的,而不是我生成的。
    • 确实如此。我建议不要使用 link_to 'Back', :back,而是使用 link_to 'Back', '#', data: {behavior: 'back-link'}。然后在 JS 中: $('[data-behavior~=back-link]').on('click', function(){history.back});
    【解决方案2】:

    使用有效的内容安全策略无法将内联代码或内联样式列入哈希白名单。上面的例子只有在history.back() 是这样一个脚本标签的内容时才有效:

    <script>history.back()</script>
    

    Chrome 的错误信息具有误导性,因为它建议使用哈希方法将实际上不支持的内联代码列入白名单。

    这同样适用于像style="display:none" 这样的内联样式(例如在nested_form gem 中使用)。

    unsafe-inline 的使用对我的项目来说是不可取的。所以我通过猴子修补类或模块以使用不同的标记(例如class="hidden")以及一些额外的外部javascript(如果需要)解决了这些罕见的问题,但在更新受影响的gem时当然有缺点。

    【讨论】:

      猜你喜欢
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-03
      • 2017-08-05
      • 2019-04-17
      • 2018-03-06
      • 2013-01-13
      • 2021-04-13
      相关资源
      最近更新 更多