尽管 Rack::Cors [重复],但请求仍触及生产 Rails API

Posted

技术标签:

【中文标题】尽管 Rack::Cors [重复],但请求仍触及生产 Rails API【英文标题】:Requests hit production Rails API despite Rack::Cors [duplicate] 【发布时间】:2019-11-08 11:47:49 【问题描述】:

我有一个 Rails API,我在我的application.rb 中设置了Rack::Cors,以防止来自https://my-website.com 以外的任何来源的请求:

config.middleware.insert_before 0, Rack::Cors do
  allow do
    origins 'https://my-website.com'
    resource '*',
             headers: %w[Authorization],
             methods: %i[get post put delete options head],
             expose: %w[Authorization]
  end
end

另外我允许 websocket 连接为:

config.action_cable.url = %r/wss:\/\/*/
config.action_cable.allowed_request_origins = 'https://my-website.com'

最后,我的Application Load Balancer 有一个status 检查器,为此我允许/status 的http 请求为:

config.force_ssl = true
config.ssl_options = 
  hsts:  subdomains: true ,
  redirect:  exclude: ->(request)  request.path =~ /status/  
 

所以你可以看到除了/status 之外的每条路径都应该是https 但我仍然在我的生产错误跟踪器中遇到如下错误:

#590 ActionController::RoutingError: No route matches [OPTIONS] "/"

在详细信息中,我得到的来源是:

当我的CORS configuration 中没有添加起点时,某人如何设法到达我的实际路线?

【问题讨论】:

有人可以使用非浏览器向您的服务器发出 HTTP 请求。 当有人访问https://ip/时,最后一行(OPTIONS /)是一个非常标准的“CORS飞行前请求” CORS 不是“服务器保护”。这只是对浏览器的“建议”。 ***.com/questions/4850702/… 是的,你是对的:当你有一个公共端点时,任何人都可以请求。此外,当你有一个生产应用程序时,你每天都会在日志中看到来自机器人、黑客等的大量请求。所以,唯一的办法就是实现认证。 【参考方案1】:

Rack::Cors 仅在请求具有 Access-Control-Request-Method 标头时才响应 OPTIONS 请求,如果有人在没有它的情况下发出该请求 - 请求将命中您的常规路由。

另外请注意,CORS 只是浏览器允许跨域请求的一种方法,任何人都可以使用一些非浏览器脚本或工具来伪造他们想要的任何请求。

【讨论】:

以上是关于尽管 Rack::Cors [重复],但请求仍触及生产 Rails API的主要内容,如果未能解决你的问题,请参考以下文章

我在我的 Rails 应用程序中设置了 CORS,但我仍然收到错误 [重复]

Heroku、Rails 4 和 Rack::Cors

rails跨域请求配置

尽管在数据帧上使用 .loc 方法,但仍获得 SettingWithCopyWarning [重复]

尽管视图初始化,有时仍会显示已删除的项目-Vue,Node.js [重复]

尽管在 IB 中链接,但标签仍为 nil