4 Pojawi Szyny ustawić domyślną wartość SAMEORIGIN
dla X-Frame-Options
nagłówka odpowiedzi HTTP. Jest to świetne ze względów bezpieczeństwa, ale nie pozwala na udostępnianie części aplikacji w iframe
innej domenie.
Możesz nadpisać wartość X-Frame-Options
globalną, używając config.action_dispatch.default_headers
ustawienia:
config.action_dispatch.default_headers['X-Frame-Options'] = "ALLOW-FROM https://apps.facebook.com"
Ale jak zastąpić to dla pojedynczego kontrolera lub akcji?
ruby-on-rails
iframe
http-headers
ruby-on-rails-4
x-frame-options
Chris Peters
źródło
źródło
redirect_to
i akcja, do której przekierowuje, wymagałyby zastosowania tego. Czy otrzymujesz konkretny błąd? Brzmi jak dobre nowe pytanie na temat przepełnienia stosu!after_action
przed przekierowaniem do ostatecznej akcji kontrolera, która przekierowuje doAngular
tras. Dziękuję Ci!after_action
, chociaż jest to przydatne np. WFrontend::BaseController
przypadku, gdy dotyczy to całej nakładki. Równie dobrze możesz biecresponse.headers.except! ...
w ramach akcji.Chciałem tylko dołączyć zaktualizowaną odpowiedź dla każdego, kto znajdzie ten link, próbując dowiedzieć się, jak zezwolić aplikacji Rails na osadzenie w I-Frame i napotkanie problemów.
W chwili pisania tego, 28 maja 2020 r., Zmiany opcji X-Frame prawdopodobnie nie są najlepszym rozwiązaniem twojego problemu. Opcja „ZEZWÓL-OD” została całkowicie zabroniona przez wszystkie główne przeglądarki.
Nowoczesne rozwiązanie polega na zaimplementowaniu Content-Security-Policy i ustawieniu polityki 'frame_ancestors'. Klucz „frame_ancestors” wskazuje, które domeny mogą osadzać Twoją aplikację jako element iframe. Obecnie jest obsługiwany przez główne przeglądarki i zastępuje X-Frame-Options. Pozwoli to zapobiec przechodzeniu przez Clickjacking (w którym X-Frame-Options miał pomóc, zanim w dużej mierze stał się przestarzały) i zablokować aplikację w nowoczesnym środowisku.
Możesz ustawić Content-Security-Policy z Railsami 5.2 w inicjatorze (przykład poniżej), a dla Rails <5.2 możesz użyć klejnotu takiego jak klejnot Secure Headers: https://github.com/github/secure_headers
Jeśli chcesz, możesz również zastąpić specyfikacje zasad na podstawie kontrolera / akcji.
Zasady bezpieczeństwa zawartości doskonale nadają się do zaawansowanych zabezpieczeń. Sprawdź wszystkie rzeczy, które możesz skonfigurować w dokumentacji Rails: https://edgeguides.rubyonrails.org/security.html
Przykład Rails 5.2 dla 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
Przykład zmiany polityki specyficznej dla kontrolera:
# 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
źródło
p.frame_ancestors :self, -> { company&.allowed_domain || 'none' }
W przypadku Rails 5+ użyj
response.set_header('X-Frame-Options', 'ALLOW-FROM https://apps.facebook.com')
zamiast tego. Lub jeśliALLOW-FROM
nie działa i potrzebujesz szybkiej naprawy, możesz ustawićALLOWALL
źródło