Rails 4 parece establecer un valor predeterminado SAMEORIGIN
para el X-Frame-Options
encabezado de respuesta HTTP. Esto es excelente para la seguridad, pero no permite que partes de su aplicación estén disponibles en un iframe
dominio diferente.
Puede anular el valor de X-Frame-Options
globalmente usando la config.action_dispatch.default_headers
configuración:
config.action_dispatch.default_headers['X-Frame-Options'] = "ALLOW-FROM https://apps.facebook.com"
Pero, ¿cómo lo anula para un solo controlador o acción?
ruby-on-rails
iframe
http-headers
ruby-on-rails-4
x-frame-options
Chris Peters
fuente
fuente
redirect_to
y la acción a la que redirige necesitarían aplicar esto. ¿Está recibiendo un error en particular? ¡Suena como una buena pregunta nueva en Stack Overflow!after_action
antes de que se redirigiera a la acción final del controlador que redirige a lasAngular
rutas. ¡Gracias!after_action
, aunque es útil hacerlo, por ejemplo, en unFrontend::BaseController
donde se aplica a toda la interfaz. También puedes correrresponse.headers.except! ...
dentro de una acción.Solo quería incluir una respuesta actualizada aquí para cualquiera que encuentre este enlace cuando intente averiguar cómo permitir que su aplicación Rails se incruste en un I-Frame y tenga problemas.
Al momento de escribir esto, el 28 de mayo de 2020, los cambios de X-Frame-Options probablemente no sean la mejor solución a su problema. La opción "PERMITIR DESDE" ha sido totalmente rechazada por los principales navegadores.
La solución moderna es implementar una política de seguridad de contenido y establecer una política de 'frame_ancestors'. La clave 'frame_ancestors' designa qué dominios pueden incrustar su aplicación como un iframe. Actualmente es compatible con los principales navegadores y anula sus X-Frame-Options. Esto le permitirá evitar el secuestro de clics (con el que originalmente se pretendía ayudar X-Frame-Options antes de que se volviera obsoleto) y bloquear su aplicación en un entorno moderno.
Puede configurar una política de seguridad de contenido con Rails 5.2 en un inicializador (ejemplo a continuación), y para Rails <5.2 puede usar una gema como la gema Secure Headers: https://github.com/github/secure_headers
También puede anular las especificaciones de la política en función del controlador / acción si lo desea.
Las políticas de seguridad de contenido son excelentes para las protecciones de seguridad avanzadas. Consulte todas las cosas que puede configurar en los documentos de Rails: https://edgeguides.rubyonrails.org/security.html
Un ejemplo de Rails 5.2 para una política de seguridad de contenido:
# config/initializers/content_security_policy.rb Rails.application.config.content_security_policy do |policy| policy.frame_ancestors :self, 'some_website_that_embeds_your_app.com' end
Un ejemplo de un cambio específico del controlador en una política:
# Override policy inline class PostsController < ApplicationController content_security_policy do |p| p.frame_ancestors :self, 'some_other_website_that_can_embed_posts.com' end end
fuente
p.frame_ancestors :self, -> { company&.allowed_domain || 'none' }
Para Rails 5+, use
response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')
en su lugar. O siALLOW-FROM
no funciona y necesita una solución rápida, puede configurarlo enALLOWALL
fuente