Rails - 仅在开发中允许在 CORS 设置中使用 localhost

Sve*_*ies 4 ruby-on-rails rack-cors

我正在为我的 rails 服务器配置 CORS 设置 - 我希望能够在本地运行时测试我的后端,使用本地主机上的前端。

但是,据我所知,CORS 是针对 CSRF(?) 的重要安全机制,因此当应用程序投入生产时,我希望后端只允许实时网站的来源。像这样:


if development:
  allow do
    origins 'localhost:3000', 'localhost:3001', 'https://my-app.com'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

if production:
  allow do
    origins 'https://my-app.com'

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end

Run Code Online (Sandbox Code Playgroud)

我知道让一个未知用户在本地主机上运行一个恶意应用程序并且不知道他们在做什么是相当困难的,但仍然比我说的抱歉更安全。

我该怎么办?为什么这没有在 Rack::CORS 的 Github 页面上显着地记录?我有一种感觉,我错过了一些东西。请赐教。

max*_*max 5

如果您使用 Rails 5 或更早版本,则可以在将 Rack::CORS 中间件注入堆栈时处理配置:

# config/initializers/cors.rb
Rails.application.config.middleware.insert_before 0, Rack::Cors do
  allow do
    if Rails.env.development?
      origins 'localhost:3000', 'localhost:3001', 'https://my-app.com'
    else
      origins 'https://my-app.com'
    end

    resource '*',
      headers: :any,
      methods: [:get, :post, :put, :patch, :delete, :options, :head]
  end
end
Run Code Online (Sandbox Code Playgroud)

由于您的 Rails 应用程序在加载初始化程序时被引导,您可以通过Rails.env. 如果你想避免硬编码,你可以使用环境变量。