如何以编程方式设置content_security_policy?

时间:2018-10-25 21:57:46

标签: ruby ruby-on-rails-5 content-security-policy

我正在为Rails 5.2应用程序配置内容安全策略。我需要将CSP中的某些域列入白名单。我想将域列表放在其他位置,以便可以在应用程序的其他位置引用它们,然后从该列表以编程方式生成CSP标头。

看着source code for the Content Security Policy configuration mechanisms in Rails 5,看起来好像正在进行一些魔术元编程,所以我不清楚如何完成我需要做的事情。看来我需要调用以设置标头 might 的函数对于要调用它们的精确度非常挑剔。特别是,我不清楚我是否可以传递它们数组或安全地多次调用它们,或者它们是否执行某些元编程魔术,这些魔术仅在将域作为单独的函数参数传递时才有效。

我可以像这样将数组传递到要设置的标题吗?

whitelisted_domains = ['https://example.com', 'self']

Rails.application.configure do
  config.content_security_policy do |csp|
    csp.child_src whitelisted_domains
  end
end

或者我可以像这样多次调用同一个函数吗?

whitelisted_domains = ['https://example.com', 'self']

Rails.application.configure do
  config.content_security_policy do |csp|
    whitelisted_domains.each {|domain| csp.child_src domain}
  end
end

如果这些都不起作用,那么完成我想做的最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

从源代码和文档可以看出,它需要一个数组。在导轨的边缘导轨上,发布以下内容

Rails.application.config.content_security_policy do |policy|
  policy.default_src :self, :https
  ...
end

sourcecode,使用*sources作为参数;它认为它需要任何数量的参数,这意味着您可以按照以下方式进行操作:

whitelisted_domains = ['https://example.com', 'self']

Rails.application.configure do
  config.content_security_policy do |csp|
    csp.child_src(*whitelisted_domains)
  end
end

https://blog.sqreen.io/integrating-content-security-policy-into-your-rails-applications-4f883eed8f45/

https://edgeguides.rubyonrails.org/security.html#content-security-policy

每个指令的define_method的源代码 https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/http/content_security_policy.rb#L151

(注意:所有这些都没有在Rails应用程序,简洁的指南和Rails的源代码中经过测试)