Ruby on rails 6.1.7:努力使用 Turbolinks 和 CSP 渲染部分

问题描述 投票:0回答:0

我正在使用 Rails 6.1.7 与 turbolinks 和 CSP nonce based.

这是我的 CSP 配置:

    policy.default_src :self, :https
    policy.font_src    :self, :https, :data
    policy.img_src     :self, :https, :data
    policy.object_src  :none
    policy.script_src  :self, :https, "https://code.jquery.com/", "https://www.google-analytics.com"
    policy.style_src   :self, :https
    # If you are using webpack-dev-server then specify webpack-dev-server host
    policy.connect_src :self, :https, "http://localhost:3035", "ws://localhost:3035" if Rails.env.development?

Rails.application.config.content_security_policy_nonce_generator = -> request do
    if request.env['HTTP_X_TURBOLINKS_NONCE'].present?
        request.env['HTTP_X_TURBOLINKS_NONCE']
    else
        SecureRandom.base64(16)
    end
end

这是我的 application.js :

window.onload = function () {
  document.addEventListener("turbolinks:request-start", function (event) {
    console.log("in coming request");

    var xhr = event.data.xhr;

    xhr.setRequestHeader(
      "X-Turbolinks-Nonce",
      $("meta[name='csp-nonce']").prop("content")
    );
  });
};

我想要实现的是对我的控制器中的端点进行 Ajax 调用(这部分有效),然后它会呈现部分以仅更新我实际页面的一部分

控制器方法:

def get_matching_labels
  @label= "test"
  respond_to do |format|
    format.js {render layout: false}
  end
end

我有一个

get_matching_labels.js.erb
文件,其中包含:

$('#my_frame').html("<%= j (render partial: 'frame_content', locals:{label: @label}) %>")

这是我的 Ajax 调用,它被

<%= javascript_tag(nonce: true) do %>

包围
$.ajax({
      url: '/get_matching_labels',
      headers: { 'HTTP_X_TURBOLINKS_NONCE' : '<%= content_security_policy_nonce %>'},
      data:{
        label: 'test',
      },
      complete: function() {
        console.log(this.headers);
      },
      success: function(data) {
        console.log('success')
        console.log(data);
      },
      error: function() {
        console.log('failure')
      }
    }); 

如您所见,我尝试将我的实际随机数作为标头传递,这样我的 CSP 就不会为该请求生成新的随机数,因此我的脚本不会违反 CSP 规则。

注意:我的 Application.js 上有一个 console.log 但它从未被触发,看起来我试图捕获的事件不正确。

render content-security-policy turbolinks ruby-on-rails-6.1
© www.soinside.com 2019 - 2024. All rights reserved.