35 votes

Comment faire pour que Sinatra s'abstienne d'ajouter l'en-tête X-Frame-Options ?

J'utilise Sinatra pour renvoyer le contenu de certains IFRAME, et j'aimerais autoriser les src inter-domaines. Malheureusement, Sinatra ajoute automatiquement un en-tête X-Frame-Options à ma réponse. Comment puis-je le désactiver ?

80voto

matt Points 33799

Sinatra utilise Rack::Protection en particulier le frame_options qui est ce qui définit l'option X-Frame-Options en-tête.

Vous pouvez configurer les protections utilisées . Sinatra active la plupart d'entre eux par défaut, (certains ne sont activés que si vous utilisez également des sessions, et Rack::Protection lui-même n'en active pas certains par défaut).

Pour empêcher l'envoi de la X-Frame-Options vous devez désactiver l'en-tête frame_options comme ça :

set :protection, :except => :frame_options

4voto

xentek Points 878

Une autre solution, et celle que j'ai fini par utiliser en production, fait appel à monkey-Parcheando. 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

3voto

xentek Points 878

Aucune des options présentées ici n'a fonctionné pour mon application Sinatra. J'ai fini par ajouter un filtre ultérieur pour modifier le fichier X-Frame-Options en-tête pour permettre à l'application d'être encadrée par Facebook.

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

3voto

stujo Points 1

Je pense que j'ai trouvé une bonne façon de gérer cela, mais j'aimerais avoir des commentaires.

L'objectif est de désactiver les options X-Frame-Options pour une seule route afin de conserver tous les avantages de la protection du rack :

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

Je pense que c'est une bonne option car elle semble empêcher la protection du rack d'ajouter l'en-tête SAMEORIGIN sur cette route.

2voto

ted price Points 21

La réponse "set :protection, :except => :frame_options" ne fonctionne pas pour moi, avec Sinatra-1.3.3.

J'ai dû trouver une solution ; j'ai mis ce mutha dans mon fichier config.ru. Bien sûr, vous pouvez changer l'en-tête pour qu'il soit ce que vous voulez.

config.ru

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X