Estoy usando Sinatra para devolver algunos contenidos de IFRAME, y me gustaría permitir src entre dominios. Lamentablemente, Sinatra agrega automáticamente un encabezado X-Frame-Options a mi respuesta. ¿Cómo apago eso?¿Cómo consigo que Sinatra se abstenga de agregar el encabezado X-Frame-Options?
Respuesta
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
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
¡Esto generalmente es una mala idea y extremadamente peligroso! También podría romper su aplicación. – FeeJai
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
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
Esto terminó no funcionando en todos los navegadores, entonces YMMV. – xentek
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
No entiendo por qué esta es la única solución que funcionó, ¡pero lo es! –
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
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
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/'
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
- 1. cómo evitar que Sinatra se ejecute?
- 2. Agregar Bootstrap Less a Sinatra
- 3. ¿Cómo consigo que MEF se recomponga cuando cambio una pieza?
- 4. python cherrypy - cómo agregar el encabezado
- 5. Cómo agregar el encabezado soap en java
- 6. ¿Cómo consigo que java.concurrency.CyclicBarrier funcione como se espera?
- 7. Agregar un UIButton en el encabezado del encabezado de UITableView
- 8. ¿Cómo consigo que el error ModelState.AddModel se vincule con los espacios de validación creados dinámicamente?
- 9. ¿Cómo consigo que Ruby analice el tiempo como si se tratara de un huso horario diferente?
- 10. Sinatra y variables de sesión que no se configuran
- 11. ¿Cómo se hacen las pruebas en Sinatra?
- 12. Agregar UISearchBar al encabezado tableView como subvista
- 13. ¿Cómo consigo que Outlook procese una actualización de evento?
- 14. ¿Cómo se establece el encabezado para JTable?
- 15. Agregar encabezado personalizado en HttpWebRequest
- 16. ¿Cómo consigo que Maven descargue la dependencia de javax.comm?
- 17. ¿Cómo consigo que FutureTask regrese después de TimeoutException?
- 18. ¿Cómo consigo que Vim ponga automáticamente las llaves de cierre?
- 19. ¿Cómo consigo que los PNG funcionen en D2009?
- 20. Agregar encabezado HTTP a NSURLRequest
- 21. ¿Cómo consigo que este enrutamiento ASP.NET funcione correctamente?
- 22. ¿Cómo consigo que scon invoque un script externo?
- 23. ¿Cómo se crean rutas que no distinguen entre mayúsculas y minúsculas en Sinatra?
- 24. ¿Cómo consigo que los filtros Hibernate funcionen en JPA?
- 25. Ejecutar el código una vez que se ejecuta el servidor Sinatra
- 26. ¿Cómo consigo que Logback funcione bien con Eclipse?
- 27. Agregar encabezado personalizado al archivo de Excel
- 28. ¿Cómo consigo que JQuery Masonry reconozca elementos añadidos?
- 29. ¿Cómo consigo que Maven use los repositorios correctos?
- 30. ¿Cómo consigo que AutoMapper no almacene en caché objetos mapeados?
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
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
** 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