如何在Ruby on Rails中使用unsafe-hashes内容安全策略
解决Rails 6.1.7.9中CSP配置unsafe-hashes的问题
Rails 6.1的CSP DSL确实没有内置:unsafe_hashes的支持,直接添加会触发报错。你可以通过两种方式手动指定包含unsafe-hashes的CSP头:
方案1:直接在控制器中设置响应头
绕开Rails的CSP DSL,直接构造完整的CSP字符串并设置响应头,适合需要完全自定义CSP规则的场景。
在app/controllers/application_controller.rb中添加全局的before_action:
before_action :set_custom_csp def set_custom_csp # 构造完整的CSP规则,替换成你的实际哈希值和其他需要的指令 csp_rules = <<~CSP.strip default-src 'self'; script-src 'self' 'unsafe-hashes' 'sha256-你的脚本哈希值'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; # 按需添加其他directive,比如connect-src、font-src等 CSP response.set_header('Content-Security-Policy', csp_rules) end
方案2:修改CSP policy的directives属性
在Rails的CSP初始化文件中,先配置常规源,再手动修改script-src的指令内容,加入unsafe-hashes和哈希值。
在config/initializers/content_security_policy.rb中修改:
Rails.application.config.content_security_policy do |policy| # 先配置常规的CSP源 policy.default_src :self policy.style_src :self, :unsafe_inline policy.img_src :self, :data # 手动更新script-src指令,添加unsafe-hashes和哈希值 policy.directives[:script_src] = [ :self, "'unsafe-hashes'", "'sha256-你的脚本哈希值'" ].join(' ') end
注意事项
- 哈希值必须用单引号包裹,且要和你
oninput事件中的代码完全匹配(包括空格、大小写)。可以直接复制浏览器控制台CSP报错信息里给出的哈希值,避免手动计算出错。 - 如果你的应用启用了CSP的
report_only模式,需要对应修改Content-Security-Policy-Report-Only头,或者在初始化文件中用config.content_security_policy_report_only配置。
内容的提问来源于stack exchange,提问作者mattwise
相关产品推荐
相关产品推荐

