我正在为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
如果这些都不起作用,那么完成我想做的最好的方法是什么?
答案 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://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的源代码中经过测试)