O Rails 4 parece definir um valor padrão de SAMEORIGIN
para o X-Frame-Options
cabeçalho de resposta HTTP. Isso é ótimo para segurança, mas não permite que partes do seu aplicativo estejam disponíveis em um iframe
domínio diferente.
Você pode substituir o valor de X-Frame-Options
globalmente usando a config.action_dispatch.default_headers
configuração:
config.action_dispatch.default_headers['X-Frame-Options'] = "ALLOW-FROM https://apps.facebook.com"
Mas como você o substitui por apenas um único controlador ou ação?
ruby-on-rails
iframe
http-headers
ruby-on-rails-4
x-frame-options
Chris Peters
fonte
fonte
redirect_to
quanto a ação para a qual ele redireciona precisariam que isso fosse aplicado. Você está recebendo um erro específico? Parece uma boa pergunta nova no Stack Overflow!after_action
antes de ser redirecionado para a ação final do controlador que redireciona para asAngular
rotas. Obrigado!after_action
, embora seja útil fazê-lo, por exemplo, em aFrontend::BaseController
onde se aplica a todo o frontend. Você também pode correrresponse.headers.except! ...
dentro de uma ação.Eu só queria incluir uma resposta atualizada aqui para qualquer pessoa que encontrar este link ao tentar descobrir como permitir que seu aplicativo Rails seja incorporado em um I-Frame e encontrar problemas.
No momento em que escrevi isso, 28 de maio de 2020, as alterações das Opções do X-Frame provavelmente não são sua melhor solução para o seu problema. A opção "ALLOW-FROM" foi totalmente proibida por todos os principais navegadores.
A solução moderna é implementar uma Política de Segurança de Conteúdo e definir uma política 'frame_ancestors'. A chave 'frame_ancestors' designa quais domínios podem incorporar seu aplicativo como um iframe. Atualmente é compatível com os principais navegadores e substitui as opções do X-Frame. Isso permitirá que você evite o Clickjacking (para o qual o X-Frame-Options foi originalmente criado para ajudar antes de se tornar obsoleto) e bloqueie seu aplicativo em um ambiente moderno.
Você pode configurar uma Content-Security-Policy com Rails 5.2 em um inicializador (exemplo abaixo), e para Rails <5.2 você pode usar uma gem como a gem Secure Headers: https://github.com/github/secure_headers
Você também pode substituir as especificações de política em uma base de controlador / ação, se desejar.
As políticas de segurança de conteúdo são ótimas para proteções de segurança avançadas. Verifique todas as coisas que você pode configurar nos documentos Rails: https://edgeguides.rubyonrails.org/security.html
Um exemplo do Rails 5.2 para uma política de segurança de conteúdo:
# 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
Um exemplo de uma mudança específica do controlador em uma 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
fonte
p.frame_ancestors :self, -> { company&.allowed_domain || 'none' }
frame_ancestors
e funciona em todos os navegadores, menos no Safari. Alguma ideia?Para Rails 5+, use
response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')
. Ou seALLOW-FROM
não funcionar e você precisar de uma solução rápida, pode configurá-lo paraALLOWALL
fonte