Rails 4, по-видимому, устанавливает значение по умолчанию SAMEORIGIN
для X-Frame-Options
заголовка ответа HTTP. Это отлично подходит для обеспечения безопасности, но не позволяет частям вашего приложения быть доступными в iframe
другом домене.
Вы можете переопределить значение X-Frame-Options
глобально, используя config.action_dispatch.default_headers
настройку:
config.action_dispatch.default_headers['X-Frame-Options'] = "ALLOW-FROM https://apps.facebook.com"
Но как отменить его для одного контроллера или действия?
redirect_to
что это необходимо применить как к действию, содержащему, так и к действию, на которое он перенаправляет. Вы получаете конкретную ошибку? Похоже, хороший новый вопрос о переполнении стека!after_action
до того, как он был перенаправлен на последнее действие контроллера, которое перенаправляет наAngular
маршруты. Спасибо!after_action
, хотя это удобно, например, в a,Frontend::BaseController
где это применяется ко всему интерфейсу. Вы также можете запуститьresponse.headers.except! ...
действие.Я просто хотел включить сюда обновленный ответ для всех, кто найдет эту ссылку, пытаясь выяснить, как разрешить встраивание вашего Rails-приложения в I-Frame и столкнуться с проблемами.
На момент написания этой статьи, 28 мая 2020 года, изменения X-Frame-Options, вероятно, не являются вашим лучшим решением вашей проблемы. Опция «РАЗРЕШИТЬ-ОТ» полностью запрещена всеми основными браузерами.
Современное решение - реализовать Content-Security-Policy и установить политику frame_ancestors. Ключ frame_ancestors указывает, какие домены могут встраивать ваше приложение в качестве iframe. В настоящее время он поддерживается основными браузерами и отменяет ваши параметры X-Frame. Это позволит вам предотвратить кликджекинг (с которым X-Frame-Options изначально должен был помочь до того, как он стал устаревшим) и заблокировать ваше приложение в современной среде.
Вы можете настроить Content-Security-Policy с Rails 5.2 в инициализаторе (пример ниже), а для Rails <5.2 вы можете использовать гем, такой как гем Secure Headers: https://github.com/github/secure_headers
Вы также можете переопределить спецификации политики для контроллера / действия, если хотите.
Content-Security-Policies отлично подходят для расширенной защиты. Ознакомьтесь со всем, что вы можете настроить, в документации Rails: https://edgeguides.rubyonrails.org/security.html
Пример Rails 5.2 для Content-Security-Policy:
# 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
Пример изменения политики для конкретного контроллера:
# 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
источник
p.frame_ancestors :self, -> { company&.allowed_domain || 'none' }
Для Rails 5+ используйте
response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')
вместо него. Или, еслиALLOW-FROM
не работает и вам нужно быстрое исправление, вы можете установить его наALLOWALL
источник