我正在使用 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 但它从未被触发,看起来我试图捕获的事件不正确。