Рельсы 6 устанавливают политику CSP - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь настроить политику 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

Есть две проблемы, которые, как представляется, мешают реализации в режиме разработки:

1 / кажется, что он предотвращает уведомление тостера (установлено из webpacker)

Как разрешить уведомления тостера?

Решено добавлением: unsafe_inline. в среду разработки также

2 / встроенный скрипт в приложении. html .erb

это тоже решаемо, но я буду рад переместить скрипт ниже, если смогу ссылаться на injectSvgSprite ('<% = asset_url ("icons / icons.svg")%>'). работать из папки javascript.

Как разрешить встроенный скрипт? Я счастлив переместить это в папку javascript, но не смог связать папку спрайтов.

заголовок содержит: <%= 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>

3 / в качестве вспомогательного здесь: Sipper нуждается в вышеуказанном CDN для работы

У меня установлен пряжа swiper, и он требуется в приложении. js, включите его в pack_tag, но мне все еще нужно сослаться на банку для javascript (css работал без него). Что я пропустил?

1 Ответ

0 голосов
/ 14 апреля 2020

в 1 / я в конечном итоге использовал гем secure_headers и следовал советам, содержащимся в https://bauland42.com/ruby-on-rails-content-security-policy-csp/

Я все еще настраиваю политику.

в 2 / У меня есть встроенный svg, используя svgeez gem

...