ruby-on-rails - rails 6 设置 CSP 策略
问题描述
我正在尝试设置 CSP 策略(收集自:Evil Martian Blog):
Rails.application.config.content_security_policy do |policy|
policy.font_src :self, :https, :data
policy.img_src :self, :https, :data
policy.object_src :none
policy.style_src :self, :https, :unsafe_inline
# If you are using webpack-dev-server then specify webpack-dev-server host
if Rails.env.development?
policy.script_src :self, :http, :unsafe_inline
## policy.script_src :self, :http, :unsafe_eval
policy.default_src :self, :http, :unsafe_eval
policy.connect_src :self, :http, 'http://localhost:3035', 'ws://localhost:3035', 'http://localhost:3000', 'ws://localhost:3000'
else
policy.script_src :self, :https, :unsafe_inline
policy.default_src :self, :https
# Specify URI for violation reports
# policy.report_uri "/csp-violation-report-endpoint"
end
end
编辑=>我最终使用了secure_headers gem并遵循了https://bauland42.com/ruby-on-rails-content-security-policy-csp/中包含的建议
有两个问题似乎阻碍了开发模式的实施:
1/ 它似乎阻止了烤面包机通知(从 webpacker 安装)
如何允许烤面包机通知?
通过添加 :unsafe_inline 解决。也到开发环境
2/ application.html.erb 中的内联脚本
这也解决了,但如果我可以引用 injectSvgSprite('<%=asset_url("icons/icons.svg") %>'),我会很乐意移动下面的脚本。从 javascript 文件夹工作。
我怎样才能允许内联脚本?我很高兴将其移至 javascript 文件夹,但无法链接 sprite 文件夹。
头部包含:<%= csrf_meta_tags %>
。和<%= csp_meta_tag %>
然后来了:
<body>
<%= custom_bootstrap_flash %>
<%= yield %>
<script>
// ------------------------------------------------------- //
// Inject SVG Sprite -
// see more here
// https://css-tricks.com/ajaxing-svg-sprite/
// ------------------------------------------------------ //
function injectSvgSprite(path) {
var ajax = new XMLHttpRequest();
ajax.open("GET", path, true);
ajax.send();
ajax.onload = function(e) {
var div = document.createElement("div");
div.className = 'd-none';
div.innerHTML = ajax.responseText;
document.body.insertBefore(div, document.body.childNodes[0]);
}
}
injectSvgSprite('<%= asset_url("icons/icons.svg") %>')
</script>
<!-- Swiper Carousel -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/Swiper/4.4.1/js/swiper.min.js"></script>
编辑 => 我已经使用 svgeez gem 设置了 svg inline 在此处输入链接描述
3/ 作为这里的附属:Sipper 需要上述 CDN 才能工作
我已经安装了 swiper,并在 application.js 中需要它,将它包含在 pack_tag 中,但我仍然需要为 javascript 引用罐子(没有它的 css 工作)。我错过了什么?
解决方案
推荐阅读
- magento - 获取两种状态之间的订单
- javascript - Laravel 5.8 尝试通过 AJAX 调用删除评论无法加载
- c# - 如何使用 Linq 从 List<> 计算值的范围?
- javascript - 反应 | 未定义解构赋值时传递默认道具值时出错
- javascript - Vue/Webpack 项目中 tfjs 的“未找到依赖项”
- excel - 输入不同的值后更改单元格的颜色
- typescript - Vue.prototype.$property 不适用于 Typescript
- python - 数据透视表中的条形图,包含总计和每组聚合的百分比
- c - 使用#define 给结构成员起别名
- c# - 如何更新\刷新多个视图上使用的相同用户控件