【问题标题】:How do I programmatically set a content_security_policy?如何以编程方式设置 content_security_policy?
【发布时间】:2018-10-25 21:57:45
【问题描述】:

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

看看source code for the Content Security Policy configuration mechanisms in Rails 5,好像有一些神奇的元编程正在进行,所以我不清楚如何完成我需要做的事情。看起来我需要调用来设置标题的函数可能对它们想要被调用的方式很挑剔。特别是,我不清楚我是否可以向它们传递数组或安全地多次调用它们,或者它们是否做了一些元编程魔法,只有当域作为单独的函数参数传入时才有效。

我可以像这样将一个数组传递给我想要设置的标题吗?

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

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

【问题讨论】:

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


    【解决方案1】:

    从源代码和文档中可以看出,它需要一个数组。从 rails 的 edgeguides 发布以下内容

    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 源代码中测试过)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-04-13
      • 2011-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-15
      • 2018-03-14
      相关资源
      最近更新 更多