当前位置: 首页 > news >正文

[ruby on rails]rack-cors, rack-attack

gem 'rack-attack'
gem 'rack-cors'

1. rack-attack 可以根据ip、域名等设置黑名单、设置访问频率

  • 设置黑名单
# 新增 config/initializers/rack_attack.rb
# 请求referer如果匹配不上设置的allowed_origins,返回403 forbidden
Rack::Attack.blocklist('block bad domains') do |req|next if !req.path.start_with?('/admin_api/') || Rails.env.test?Rails.application.credentials.allowed_origins.none? { |r| Regexp.new(r) =~ req.referer }
end# EDITOR="vim" bin/rails credentials:edit
allowed_origins:- api.xxx.net- localhost
  • 设置访问频率
class Rack::Attack# Rack::Attack.cache.store = ActiveSupport::Cache::RedisCacheStore.new(url: "...")Rack::Attack.cache.store = ActiveSupport::Cache::MemoryStore.new# key: "rack::attack:#{Time.now.to_i/:period}:public_data/ip:#{req.ip}"throttle('public_data/ip', limit: 2, period: 1.minutes) do |req|req.ip if req.path.start_with?('/pc/v1/public_data')endself.throttled_responder = lambda do |_env|[429, # status{}, # headers['throttling, retry later']] # bodyend
end

2. rack-cors 可以根据域名、访问方法、资源设置跨域请求cors

# config/initializers/cors.rbRails.application.config.middleware.insert_before 0, Rack::Cors doallow doorigins '*'resource '*', headers: :any, methods: [:get, :post, :put, :patch, :delete, :options, :head],end
end
  • 复杂一些
Rails.application.config.middleware.insert_before 0, Rack::Cors doallow doorigins 'localhost:3000', '127.0.0.1:3000',/\Ahttp:\/\/192\.168\.0\.\d{1,3}(:\d+)?\z/# regular expressions can be used hereresource '/file/list_all/', :headers => 'x-domain-token'resource '/file/at/*',methods: [:get, :post, :delete, :put, :patch, :options, :head],headers: 'x-domain-token',expose: ['Some-Custom-Response-Header'],max_age: 600# headers to exposeendallow doorigins '*'resource '/public/*', headers: :any, methods: :get# Only allow a request for a specific hostresource '/api/v1/*',headers: :any,methods: :get,if: proc { |env| env['HTTP_HOST'] == 'api.example.com' }end
end

相关文章:

  • 学习网络编程No.10【深入学习HTTPS】
  • 计算机视觉的基本概念和技术有哪些?
  • python和PYtorch学习
  • 如何用Java设计自动售货机?
  • 《轻购优品》新零售玩法:消费积分认购+众筹新玩法
  • 【DevOps】Git 图文详解(四):Git 使用入门
  • 三十二、W5100S/W5500+RP2040树莓派Pico<UPnP示例>
  • @AutoConfigurationPackage的使用
  • C++中vector的emplace_back()方法和push_back()方法
  • 通过制作llama_cpp的docker镜像在内网离线部署运行大模型
  • idea运行项目之后一直卡在Writing classes… 解决方案
  • 教程:使用 Keras 优化神经网络
  • 力扣刷题-二叉树-完全二叉树的节点个数
  • PyCharm:PyCharm新建.py文件时自动带出指定内容
  • java桌面程序
  • IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)
  • 分享一款快速APP功能测试工具
  • Bootstrap JS插件Alert源码分析
  • EOS是什么
  • ESLint简单操作
  • HTML中设置input等文本框为不可操作
  • Java方法详解
  • Logstash 参考指南(目录)
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • PermissionScope Swift4 兼容问题
  • windows下mongoDB的环境配置
  • 初识MongoDB分片
  • 从零开始学习部署
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 利用jquery编写加法运算验证码
  • 判断客户端类型,Android,iOS,PC
  • 使用Tinker来调试Laravel应用程序的数据以及使用Tinker一些总结
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • Spark2.4.0源码分析之WorldCount 默认shuffling并行度为200(九) ...
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 数据可视化之下发图实践
  • (4)Elastix图像配准:3D图像
  • (html5)在移动端input输入搜索项后 输入法下面为什么不想百度那样出现前往? 而我的出现的是换行...
  • (NO.00004)iOS实现打砖块游戏(九):游戏中小球与反弹棒的碰撞
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (第二周)效能测试
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (附源码)springboot“微印象”在线打印预约系统 毕业设计 061642
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)ssm考生评分系统 毕业设计 071114
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (蓝桥杯每日一题)love
  • (论文阅读11/100)Fast R-CNN
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (转)ObjectiveC 深浅拷贝学习
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .NET Core 2.1路线图
  • .NET6 开发一个检查某些状态持续多长时间的类