2011-10-20 8 views

Respuesta

78

Sinatra usa Rack::Protection, en particular la opción frame_options, que es lo que configura el encabezado X-Frame-Options.

Puede configure which protections are used. Sinatra enciende la mayoría de ellos de manera predeterminada (algunos solo están habilitados si también está utilizando sesiones, y Rack :: Protection en sí mismo no habilita algunos de manera predeterminada).

Para evitar el envío de la cabecera X-Frame-Options necesita desactivar frame_options así:

set :protection, :except => :frame_options 
+0

Eso hizo el trabajo, gracias! En mi búsqueda de Internet, me encontré con todas las piezas individuales que mencionaste, pero no había sido capaz de combinarlas en esa línea efectiva de código que me diste. Muy apreciado. – Bruce

+0

Muchas gracias, @matt! Estoy desarrollando mi primera aplicación en Sinatra, una aplicación de Facebook para lienzos, y este problema me consumió durante 2 días ... :) – rapcal

+0

** Este es un riesgo de seguridad ** Si solo quieres incluir una lista blanca en Facebook, y no desactivar esta importante característica de seguridad en absoluto, mejor haz esto: 'set: protection,: origin_whitelist => ['https://s-static.ak.facebook.com']' – FeeJai

2

El "set: protección,: a excepción =>: Frame_Options" respuesta no funcionó para mí, usando Sinatra-1.3. 3

Tuve que hackear una solución; Puse este mutha en mi archivo config.ru. Obvs puedes cambiar el encabezado para que sea lo que quieras.

config.ru

class Rack::Protection::FrameOptions 
    def header 
    @header ||= {} 
    end 
end 
+0

¡Esto generalmente es una mala idea y extremadamente peligroso! También podría romper su aplicación. – FeeJai

3

Ninguna de las opciones presentadas aquí trabajaban para mi aplicación Sinatra. Terminé agregando un filtro posterior para modificar el encabezado X-Frame-Options para permitir que Facebook encuadre la aplicación.

after do 
    headers({ 'X-Frame-Options' => 'ALLOW-FROM apps.facebook.com' }) 
end 
+0

Prefiero esta solución porque: a) funciona en sinatra 1.4.3 yb) es más segura, puedo poner esta declaración directamente dentro de cada acción individual para que pueda proteger a todos menos a aquellos que espero de todos menos los dominios que espero. – Saboosh

+2

Esto terminó no funcionando en todos los navegadores, entonces YMMV. – xentek

4

Otra solución, y la que terminó con la producción, implica mono-parches 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

No entiendo por qué esta es la única solución que funcionó, ¡pero lo es! –

+0

No puedo creer que realmente use esto en producción. Creo que esto realmente mata a * todos * los encabezados de seguridad. En su lugar, debe proporcionar una excepción para las URL que necesita – FeeJai

+0

En mi caso, toda la aplicación se ejecutó dentro del iframe de Facebook, por lo que fue apropiado. Además, el nivel de seguridad que proporciona este encabezado es bastante mínimo y depende completamente del soporte del cliente. – xentek

1

En realidad, la solución dada por @ Matt sigue trabajando con Sinatra v1.4.5.

Sí, Sinatra está utilizando Rack::Protection y de acuerdo con Configuring attack protection

que podría o bien desactivar la protección en absoluto (no recomendado):

disable :protection 

o únicamente desactivar Frame_Options:

set :protection, :except => :frame_options 

Aparte de eso, si su problema no es debido a X-Frame-Options , Puede ser Access-Control-Allow-Origen, entonces lo que tienes que hacer es añadir debajo de la línea de la ruta antes de la instrucción return:

response['Access-Control-Allow-Origin'] = 'http://www.example.com/' 
2

creo que he encontrado una buena manera de manejar esto pero daría la bienvenida a la retroalimentación

El objetivo es desactivar los X-Frame-Options sólo por una ruta de mantener todos los beneficios de protección de rejilla:

app.get'/hello_world' do 
     headers({ 'X-Frame-Options' => '' }) 
     "HELLO WORLD" 
    end 

creo que esta es una buena opción, ya que parece impedir la protección de rack de agregar el MISMO ORIGEN encabezado en esta ruta

Cuestiones relacionadas