diff --git a/config/initializers/cors.rb b/config/initializers/cors.rb index 008aa33b..7117dbb3 100644 --- a/config/initializers/cors.rb +++ b/config/initializers/cors.rb @@ -6,8 +6,36 @@ # @see {https://github.com/cyu/rack-cors#origin} Rails.application.config.middleware.insert_before 0, Rack::Cors do allow do - # Ver el historial de git para saber cómo llegamos a esto... - origins '*' + # Queremos obtener un dominio válido y no permitir ningún otro + # origen. Como los sitios pueden tener muchos orígenes, necesitamos + # una forma de encontrarlos por su URL. + # + # El problema sería que otros sitios con JS malicioso hagan pedidos + # a nuestra API desde otros sitios infectados. + # + # XXX: La primera parte del dominio tiene que coincidir con el + # nombre del sitio. + # + # XXX: Al terminar de entender esto nos pasó que el servidor recibe + # la petición de todas maneras, con lo que no estamos previniendo + # que nos hablen, sino que lean información. + # + # TODO: Limitar el acceso desde Nginx también. + # TODO: Poder consultar por sitios por todas sus URLs posibles. + origins do |source, _| + # Cacheamos la respuesta para no tener que volver a procesarla + # cada vez. + Rails.cache.fetch(source, expires_in: 1.hour) do + if (name = URI(source)&.host&.split('.', 2)&.first).present? + Site.where(name: name).pluck(:name).first.present? + else + false + end + rescue URI::Error + false + end + end + resource '*', headers: :any, methods: %i[get post patch put] end end