2011-10-20 15 views

Odpowiedz

78

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 
+0

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

+0

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

+0

** 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

2

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 
+0

Jest to ogólnie zły pomysł i bardzo niebezpieczne! Również mogę złamać twoje zgłoszenie. – FeeJai

3

Ż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 
+0

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

+2

To nie działało w każdej przeglądarce, więc YMMV. – xentek

4

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 
+0

Nie rozumiem, dlaczego to jedyne rozwiązanie, które działało, ale jest! –

+0

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

+0

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

1

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/' 
2

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