Używam Sinatry do zwrócenia zawartości IFRAME i chciałbym zezwolić na src w wielu domenach. Niestety, Sinatra automatycznie dodaje nagłówek Opcje X-Frame do mojej odpowiedzi. Jak mogę to wyłączyć?Jak zmusić Sinatrę do powstrzymania się od dodawania nagłówka Opcje X-Frame?
Odpowiedz
Sinatra używa Rack::Protection, w szczególności opcji frame_options
, która ustawia nagłówek X-Frame-Options
.
Możesz configure which protections are used. Sinatra włącza większość z nich domyślnie (niektóre są włączone tylko wtedy, gdy używasz sesji, a Rack :: Protection nie włącza domyślnie niektórych).
Aby uniemożliwić wysyłanie nagłówka X-Frame-Options
trzeba wyłączyć frame_options
takiego:
set :protection, :except => :frame_options
z "set: ochrona,: oprócz =>: frame_options" odpowiedź nie działa dla mnie, używając Sinatra-1,3. 3
Musiałem zhakować rozwiązanie; Umieściłem ten mutha w moim pliku config.ru. Obvs możesz zmienić nagłówek, aby był czymkolwiek, co chcesz.
config.ru
class Rack::Protection::FrameOptions
def header
@header ||= {}
end
end
Jest to ogólnie zły pomysł i bardzo niebezpieczne! Również mogę złamać twoje zgłoszenie. – FeeJai
Żaden z wariantów przedstawionych tu pracował dla mojego Sinatra app. Skończyło się na dodaniu filtru po modyfikacji, aby zmodyfikować nagłówek X-Frame-Options
, aby umożliwić oprawienie aplikacji przez Facebook.
after do
headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' })
end
Preferuję to rozwiązanie, ponieważ: a) działa w wersji 1.4.3 i b) jest bodaj bezpieczniejsze, mogę umieścić to oświadczenie bezpośrednio w ramach każdego działania, aby chronić wszystkie oprócz tych, których oczekuję od wszystkie, z wyjątkiem tych, których oczekuję. – Saboosh
To nie działało w każdej przeglądarce, więc YMMV. – xentek
Innym rozwiązaniem, a jeden skończyło się w produkcji, wymaga małpa-łatanie Rack::Protection::FrameOptions
:
# This monkeypatch is needed to ensure the X-Frame-Options header is
# never set by rack-protection.
module Rack
module Protection
class FrameOptions < Base
def call(env)
status, headers, body = @app.call(env)
[status, headers, body]
end
end
end
end
Nie rozumiem, dlaczego to jedyne rozwiązanie, które działało, ale jest! –
Nie mogę uwierzyć, że faktycznie używasz tego w produkcji. Wierzę, że to ostro zabija * wszystkie * nagłówki bezpieczeństwa. Powinieneś podać wyjątek dla adresów URL, które potrzebujesz zamiast tego – FeeJai
W moim przypadku cała aplikacja działała wewnątrz iframe Facebooka, więc było to właściwe. Również poziom bezpieczeństwa tego nagłówka jest dość minimalny iw pełni zależny od obsługi klienta. – xentek
Właściwie rozwiązanie podane przez @matt nadal pracuje z Sinatra v1.4.5.
Tak, Sinatra korzysta Rack::Protection i zgodnie Configuring attack protection
można albo ochrona wyłączyć w ogóle (co nie jest zalecane):
disable :protection
lub tylko wyłączyć frame_options:
set :protection, :except => :frame_options
Poza tym, jeśli Twój problem nie wynika z X-Frame-Options Może być Access-Control-Allow-Origin, to co trzeba zrobić, to dodać poniżej linii na trasie przed instrukcji return:
response['Access-Control-Allow-Origin'] = 'http://www.example.com/'
Myślę, że znalazłem dobry sposób obsłużyć to ale z zadowoleniem feedback
celem jest, aby wyłączyć X-Frame-Options tylko na jednej trasie, aby zachować wszystkie zalety ochrony rack:
app.get'/hello_world' do
headers({ 'X-Frame-Options' => '' })
"HELLO WORLD"
end
wierzę, że jest to dobra opcja, jak się wydaje, aby zapobiec ochrona szafy przed dodaniem SAME Nagłówek ORIGIN na tej jednej trasie
To wykonało zadanie, dzięki! Przeszukując Internet, natknąłem się na wszystkie pojedyncze fragmenty, o których wspomniałeś, ale nie udało mi się połączyć ich w jedną skuteczną linię kodu, którą mi dałeś. Bardzo doceniane. – Bruce
Wielkie dzięki, @matt! Pracuję nad moją pierwszą aplikacją w Sinatrze, aplikacji na płótnie na Facebooku, a ten problem pochłaniał mnie przez 2 dni ... :) – rapcal
** Jest to ryzyko związane z bezpieczeństwem ** Jeśli chcesz umieścić na białej liście tylko Facebook, a nie w ogóle wyłączyć tę ważną funkcję bezpieczeństwa, lepiej to zrobić: 'set: protection,: origin_whitelist => ['https://s-static.ak.facebook.com']' – FeeJai