首页 > 解决方案 > rails 6 设置 CSP 策略

问题描述

我正在尝试设置 CSP 策略(收集自:Evil Martian Blog):

 Rails.application.config.content_security_policy do |policy|
   policy.font_src    :self, :https, :data
   policy.img_src     :self, :https, :data
   policy.object_src  :none
   policy.style_src   :self, :https, :unsafe_inline
   # If you are using webpack-dev-server then specify webpack-dev-server host
   if Rails.env.development?
     policy.script_src :self, :http, :unsafe_inline
     ## policy.script_src :self, :http, :unsafe_eval
     policy.default_src :self, :http, :unsafe_eval
     policy.connect_src :self, :http, 'http://localhost:3035', 'ws://localhost:3035', 'http://localhost:3000', 'ws://localhost:3000'
   else
     policy.script_src :self, :https, :unsafe_inline
     policy.default_src :self, :https
   # Specify URI for violation reports
     # policy.report_uri "/csp-violation-report-endpoint"
   end
 end

编辑=>我最终使用了secure_headers gem并遵循了https://bauland42.com/ruby-on-rails-content-security-policy-csp/中包含的建议

有两个问题似乎阻碍了开发模式的实施:

1/ 它似乎阻止了烤面包机通知(从 webpacker 安装)

如何允许烤面包机通知?

通过添加 :unsafe_inline 解决。也到开发环境

2/ application.html.erb 中的内联脚本

这也解决了,但如果我可以引用 injectSvgSprite('<%=asset_url("icons/icons.svg") %>'),我会很乐意移动下面的脚本。从 javascript 文件夹工作。

我怎样才能允许内联脚本?我很高兴将其移至 javascript 文件夹,但无法链接 sprite 文件夹。

头部包含:<%= csrf_meta_tags %>。和<%= csp_meta_tag %>

然后来了:

<body>

  <%= custom_bootstrap_flash %>

  <%= yield %>

  <script>
    // ------------------------------------------------------- //
    //   Inject SVG Sprite -
    //   see more here
    //   https://css-tricks.com/ajaxing-svg-sprite/
    // ------------------------------------------------------ //

    function injectSvgSprite(path) {

        var ajax = new XMLHttpRequest();
        ajax.open("GET", path, true);
        ajax.send();
        ajax.onload = function(e) {
        var div = document.createElement("div");
        div.className = 'd-none';
        div.innerHTML = ajax.responseText;
        document.body.insertBefore(div, document.body.childNodes[0]);
        }
    }

    injectSvgSprite('<%= asset_url("icons/icons.svg") %>')

  </script>
<!-- Swiper Carousel -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.4.1/js/swiper.min.js"></script>

编辑 => 我已经使用 svgeez gem 设置了 svg inline 在此处输入链接描述

3/ 作为这里的附属:Sipper 需要上述 CDN 才能工作

我已经安装了 swiper,并在 application.js 中需要它,将它包含在 pack_tag 中,但我仍然需要为 javascript 引用罐子(没有它的 css 工作)。我错过了什么?

标签: ruby-on-railssvgspritecontent-security-policywebpacker

解决方案


推荐阅读