我正在使用Rails 5.2.1内容安全策略DSL实施CSP。我已将政策设置为:
Rails.application.config.content_security_policy do |policy|
policy.default_src :self, :https
policy.connect_src :self
#...
policy.script_src :self
end
# If you are using UJS then enable automatic nonce generation
Rails.application.config.content_security_policy_nonce_generator = -> request { SecureRandom.base64(16) }
我的<%= csp_meta_tag %>
中也有application.html.erb
这时,我需要在任何内联脚本中添加一个nonce: true
标志,以使它们满足策略。我已经做到了,它按预期工作。但是,我在维护现有的AJAX样式功能时遇到麻烦。例如,我有类似的内容(请注意remote: true
):
# index.html.erb
<%= link_to create_object_path, id: "#{object.code}",method: :post, remote: true do %>
<button type="button">Create object</button>
<% end %>
在我的控制器中
def create
@object = current_user.object.create
respond_to do |format|
if @object
format.js
else
redirect_back
format.html
end
end
end
在我的*.js.erb
文件中
$("#<%= @object.service.id %>").text("Added!");
该对象已成功创建,但我认为该策略阻止了我添加到DOM的上述"Added"
成功消息。我没有在控制台中看到任何错误,所以我不确定从这里去哪里。
在这种情况下,我的理解是脚本标记会临时插入*.js.erb
文件的内容,并且这些脚本标记不包含随机数。或者,这是不匹配的。
我一直在从这里解决问题。即使将数据发送到客户端的不同体系结构模式是前进的方向,此处的任何指导也将受到赞赏。预先感谢。