“X-Frame-Options tarafından yasaklanmış ekran” ın üstesinden gelmek


420

Amacı, birkaç sayfa daha çerçevelemek, sadece görüntüleme kolaylığı için bunları tek bir tarayıcı penceresinde birleştirmek olan küçük bir web sayfası yazıyorum. Çerçevelemeye çalıştığım sayfalardan birkaçı çerçevelenmeyi yasaklıyor ve "X-Frame-Options tarafından yasaklanmış bir görüntü olduğu için belgenin görüntülenmesi reddedildi." Chrome'da hata. Bunun bir güvenlik sınırlaması olduğunu (iyi bir nedenden dolayı) anlıyorum ve değiştirmeye erişimi yok.

Sayfaları tek bir pencerede görüntülemek için X-Frame-Options üstbilgisi tarafından açılmayacak alternatif çerçeveleme veya çerçevesiz yöntem var mı?


117
Sayfalarınızsa, çerçeve sınırlayıcıyı kaldırın. Aksi takdirde, sayfanın yazarının isteklerine saygı gösterin ve ONLARI ÇERÇEVEYİN.
Marc B

Bir Facebook Uygulaması için bu hatayı alıyorsanız ve AJAX çağrıları kullanıyorsanız, Facebook'un ajax kişisi için # etiketleri kullanmayı gerçekten sevdiği bir yeri okudum, bu yüzden bağlantıları değiştirmeyi deneyin, benim için çalıştı.
eric.itzhak

28
@MarcB Chrome ve Firefox, sahibi olmayan web sitelerini yerel UI kromunda etik olarak çerçeveler. Bu programlar aynı zamanda sahiplerine, FWIW için aynı menşei rahatlamış politikalara izin vermektedir. Garen-checkly'nin dediği gibi, "Amacı, birkaç sayfayı daha çerçevelemek, bunları görüntülemek için tek bir tarayıcı penceresinde birleştirmek olan küçük bir web sayfası yazıyorum." Bu temel olarak web tarayıcıyı genişletir ve tamamen etik olacaktır. Belirtilen amaç, tarayıcı pencerelerini açmak ve düzenlemek için bir bash betiği yazmaktan farklı değildir.
Samuel Danielson

1
Surfly'i kontrol edin . Tam olarak ihtiyacınız olanı yapabilir.
muodov

1
@MarcB Bu yardımcı olmuyor. OP, sayfa yazarının isteklerini umursamayabilir.
flarn2006

Yanıtlar:


211

Benzer bir sorun vardı, burada kendi sitemizdeki içeriği bir iframe'de ( Colorbox ile bir ışık kutusu tarzı iletişim kutusu olarak) görüntülemeye çalışıyordum ve sunucuda "X-Frame-Options SAMEORIGIN" başlığında kaynak sunucumuzun test sunucumuza yüklenmesini engelliyor.

Bu herhangi bir yerde belgelenmiş gibi görünmüyor, ancak iframe için çalıştığınız sayfaları düzenleyebiliyorsanız (örneğin, bunlar kendi sayfalarınızdır), tüm devre dışı bırakılmış herhangi bir dizeyle başka bir X-Frame-Options üstbilgisi göndermek SAMEORIGIN veya DENY komutları.

Örneğin. PHP için

<?php
    header('X-Frame-Options: GOFORIT'); 
?>

sayfanızın en üstünde tarayıcıların ikisini birleştirmesini sağlayacak,

X-Frame-Options SAMEORIGIN, GOFORIT

... ve sayfayı bir iframe'e yüklemenizi sağlar. Bu ilk SAMEORIGIN komutu sunucu düzeyinde ayarlandığında işe yarar ve sayfa sayfa büyük / küçük harf durumunda geçersiz kılmak istiyorsunuz.

Herşey gönlünce olsun!


3
Bir web sitesinin etrafında bir çerçeve vardı. Web sitemde, OAUTH için Instagram'a yönlendiriyorum. Instagram gönderdiği X-Frame-Options: SAMEORIGINiçin bunu çerçevenin içinde yapmanın bir yolu yoktur. Bir pop-up kullanmalısınız.
Steve Tauber

16
PHP ile yeni header_removefonksiyonu kullanmak daha iyidir , eğer mevcutsa (> = 5.3.0).
bir kedi

11
Veya X-Frame-Options'ı tüm bir dizinden kaldırmak istiyorsanız .htaccess dosyasını düzenleyebilirsiniz. Sadece satırı ekleyin:Header always unset X-Frame-Options
Jay

4
@cawecoy: Evet, asıl mesele geçersiz. Geçersiz üstbilgiyi yok sayan ve açık olmayan 'açık olmayan' tarayıcılara dayanır, bu da belirtilmemiş davranış ve güvenmesi oldukça tehlikeli olur. GOFORIT(veya başka bir rastgele keyfi geçersiz belirteç) bir sunucu tarafından uygulanan bir güvenlik önlemini kasten ihlal ediyor; sunucunun kontrolünü kendiniz kontrol ederseniz (ki bu herhangi bir gerçek kamu hizmeti için yapmanız gerekir) o zaman yapılacak doğru şey, sunucuyu ilk etapta başlığı ayarlamayacak şekilde ayarlamaktır.
bobince

31
Bu artık Chrome'da çalışmıyor gibi görünüyor. Geçersiz değerler, değerin varsayılan olarak DENY olmasına neden olur.
jamesfm

159

Bu hatayı bir YouTube videosu için alıyorsanız, tam URL'yi kullanmak yerine paylaşım seçeneklerinden gömme URL'sini kullanın. Gibi görünecekhttp://www.youtube.com/embed/eCfDxZxTBW4

Ayrıca değiştirebilir watch?v=ile embed/öylesine http://www.youtube.com/watch?v=eCfDxZxTBW4olurhttp://www.youtube.com/embed/eCfDxZxTBW4


14
Ah ilerleme ... Keşke bir hataya neden olmak ve komut dosyalarımı yeniden yazmamı sağlamak yerine bizi sadece gömme sayfasına yönlendirecekler!
joeytwiddle

122

Google Haritasını bir içine yerleştirmeye çalışırken bu hatayı alıyorsanız , kaynak bağlantıya iframeeklemeniz gerekir &output=embed.


120
Bu, genel bir "çözüm" için değil, yalnızca Google haritalarını bir iframe'e gömmek için geçerlidir.
Benjamin Wohlwend

17
Bir ışık
kutusuna

5
Bunu bir Twitter web amacı ile yapmaya çalışıyorsanız, unutun. Sadece bunu öğrenmek için farklı ışık kutusu eklentilerini denemek için tüm gün kayboldum. Kaynak: Twitter web sitesi.
Gubatron

6
&output=embed
Ekleseniz

1
@pathfinder Bu sayfa yüklendikten sonra iframe src'yi yüklerken sorun yaşadığımda benim için çalıştı
David Sykes

61

GÜNCELLEME 2019: Sen can baypas X-Frame-Optionsbir in <iframe>kullanarak sadece istemci tarafında JavaScript ve benim X-Frame-Baypas Web Bileşeni. İşte bir demo: Hacker NewsX-Frame-Bypass . (Chrome ve Firefox'ta test edilmiştir.)


3
Bu ilginç bir çözüm. FF / Chrome / Opera'da iyi çalışıyor ancak IE / Edge'de çalışmıyor. Yapacak bir şey bilen var mı?
Koleksiyoner

7
Bu artık çalışmıyor. "X-Frame-Options" ı "DENY" olarak ayarladığından " news.ycombinator.com " u bir karede görüntülemeyi reddetti . " olarak beklenen
g.pickardou

2
@ g.pickardou Google Chrome 46'da benim için çalışıyor, Hacker News'u bir iframe'de görebiliyorum.
niutech

1
@niutech bu keman, Chrome 64'te sayfayı yeniden yükledikten sonra çalışır, ancak sayfayı ilk yüklediğimde çalışmaz. (Gizli modda deneyin.)
Carl Walsh

1
Teşekkürler, bu harika!
Andrew Gans

23

Ekleme

  target='_top'

facebook sekmesindeki bağlantım benim için sorunu düzeltti ...


1
Başka bir iframe içinde bulunan Paypal iframe ile aynı sorunu vardı. Şu an çalışıyor! Teşekkürler
Fabrizio Fortino

4
Ayrıca target = '_ top' ekledim, ancak bu çözümle ilgili sorun, bağlantı artık facebook tuval olmadan yeni sekmede iframe'in dışında açılıyor.
sumitkanoje



13

Iframe moodle 2 embed çalışırken aynı sorun vardı, çözüm Site administration ► Security ► HTTP securityve kontrolAllow frame embedding


moodle yöntemi için iyi yapılır, çünkü diğer yöntemler başarısız olur / üzerine yazılır.
ericosg

7

Bu çözüm çocuklar !!

FB.Event.subscribe('edge.create', function(response) {
    window.top.location.href = 'url';
});

Facebook uygulamaları için işe yarayan tek şey!



6

Harici bir web sitesini iFrame'e yüklemek için çözüm, x-frame seçeneği harici web sitesinde reddedilecek şekilde ayarlanmış olsa bile.

Bir iFrame'e başka bir web sitesi yüklemek istiyorsanız ve Display forbidden by X-Frame-Options”hatayı alıyorsanız, bir sunucu tarafı proxy komut dosyası oluşturarak bunun üstesinden gelebilirsiniz.

srcİFrame niteliği bu gibi bakarak bir url olabilir:/proxy.php?url=https://www.example.com/page&key=somekey

Sonra proxy.php şöyle görünecektir:

if (isValidRequest()) {
   echo file_get_contents($_GET['url']);
}

function isValidRequest() {
    return $_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['key']) && 
    $_GET['key'] === 'somekey';
}

Bu, bloğu geçer, çünkü sadece sıradan bir tarayıcı sayfası ziyareti olabilecek bir GET isteğidir.

Dikkat: Bu komut dosyasındaki güvenliği artırmak isteyebilirsiniz. Çünkü bilgisayar korsanları vekil betiğiniz üzerinden web sayfalarına yüklenmeye başlayabilir.


Bunu birkaç hafta önce yapıyordum ve dış sayfada kullanılan göreli URL'ler yankı kullanırken çalışmaz. (Genellikle CSS ve / veya JS, bu yüzden yankılamadan önce URL'leri değiştirmedikçe tam işlevsellik alamayabilirsiniz.) Bir şey kaçırmadıkça ...,
ultrageek

Bunun sizin için neden gerçekleştiğinden emin değilim ... tıpkı bir son kullanıcının URL'yi ziyaret ederken yaptığı gibi normal bir HTTP isteği gibi çalışması gerekir. Dolayısıyla get_file_contents () sonucu tamamen çalışan bir HTML sayfası olmalıdır.
Floris

5

Neredeyse tüm önerileri denedim. Ancak, sorunu gerçekten çözen tek şey şuydu:

  1. .htaccessPHP dosyanızın bulunduğu klasörde bir klasör oluşturun .

  2. Bu satırı htaccess'e ekleyin:

    Header always unset X-Frame-Options

PHP'yi başka bir etki alanından iframe ile gömmek daha sonra çalışmalıdır.

Ayrıca PHP dosyanızın başlangıcına ekleyebilirsiniz:

header('X-Frame-Options: ALLOW');

Ancak benim durumumda bu gerekli değildi.


Başlık her zaman htaccess X-Frame-Options unset benim için hile yaptı
ujwal dhakal

4

Mediawiki ile aynı sorunu yaşadım, bunun nedeni sunucunun güvenlik nedenleriyle bir iframe sayfasına yerleştirmeyi reddetmesiydi.

Yazmayı çözdüm

$wgEditPageFrameOptions = "SAMEORIGIN"; 

mediawiki php config dosyasına.

Umarım yardımcı olur.


3

FWIW:

iFrameBu "kırıcı" kodu ortaya çıktığında öldürmemiz gereken bir durum vardı . Yani, ben bir function get_headers($url);göstermeden önce uzak URL kontrol etmek için PHP kullandım iFrame. Daha iyi performans için, sonuçları bir dosyaya önbelleğe aldım, böylece her seferinde bir HTTP bağlantısı yapmıyordum.


3

Tomcat 8.0.30 kullanıyordum, hiçbir öneri benim için işe yaramadı. Biz güncelleme X-Frame-Optionsve ayarlamak için arıyor gibi ALLOW, ben nasıl yerleştirme iframe izin verecek şekilde yapılandırılmış:

  • Tomcat conf dizinine gidin, web.xml dosyasını düzenleyin
  • Aşağıdaki filtreyi ekleyin:
<filter>
            <filter-name>httpHeaderSecurity</filter-name>
            <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
                   <init-param>
                           <param-name>hstsEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingEnabled</param-name>
                           <param-value>true</param-value>
                   </init-param>
                   <init-param>
                           <param-name>antiClickJackingOption</param-name>
                           <param-value>ALLOW-FROM</param-value>
                   </init-param>
            <async-supported>true</async-supported>
       </filter>

       <filter-mapping>
                   <filter-name>httpHeaderSecurity</filter-name>
                   <url-pattern>/*</url-pattern>
                   <dispatcher>REQUEST</dispatcher>
       </filter-mapping> 
  • Tomcat hizmetini yeniden başlat
  • Bir iFrame kullanarak kaynaklara erişin.

2

Bir sürü cevabı olan tek soru. Ben son tarih gününde geceleri 10:30 'da çalışması için bunun için mücadele ederken ben keşke rehber hoş geldiniz ... FB tuval uygulamaları ile bazı garip şeyler yapar, ve iyi, uyarıldı. Hala buradaysanız ve bir Facebook Canvas'ın arkasında görünecek bir Rails uygulamanız varsa, ihtiyacınız olacak:

Gemfile:

gem "rack-facebook-signed-request", :git => 'git://github.com/cmer/rack-facebook-signed-request.git'

config / facebook.yml

facebook:
  key: "123123123123"
  secret: "123123123123123123secret12312"

config / application.rb

config.middleware.use Rack::Facebook::SignedRequest, app_id: "123123123123", secret: "123123123123123123secret12312", inject_facebook: false

yapılandırma / başlatıcılar / omniauth.rb

OmniAuth.config.logger = Rails.logger
SERVICES = YAML.load(File.open("#{::Rails.root}/config/oauth.yml").read)
Rails.application.config.middleware.use OmniAuth::Builder do
  provider :facebook, SERVICES['facebook']['key'], SERVICES['facebook']['secret'], iframe:   true
end

application_controller.rb

before_filter :add_xframe
def add_xframe
  headers['X-Frame-Options'] = 'GOFORIT'
end

Facebook'un tuval ayarlarından aramak için bir denetleyiciye ihtiyacınız var, kullandım /canvas/ve rotayı SiteControllerbu uygulama için ana konuma getirdim:


class SiteController < ApplicationController
  def index
    @user = User.new
  end
  def canvas
    redirect_to '/auth/failure' if request.params['error'] == 'access_denied'
    url = params['code'] ? "/auth/facebook?signed_request=#{params['signed_request']}&state=canvas" : "/login"
    redirect_to url
  end
  def login
  end
end

login.html.erb


<% content_for :javascript do %>
  var oauth_url = 'https://www.facebook.com/dialog/oauth/';
  oauth_url += '?client_id=471466299609256';
  oauth_url += '&redirect_uri=' + encodeURIComponent('https://apps.facebook.com/wellbeingtracker/');
  oauth_url += '&scope=email,status_update,publish_stream';
console.log(oauth_url);
  top.location.href = oauth_url;
<% end %>

Kaynaklar

  • Bence yapılandırma omniauth örneğinden geldi.
  • Gem dosyası (ki anahtar !!!) geldi: öğrendim slideshare şeyler ...
  • Bu yığın sorusunun tamamı Xframe açısına sahipti, bu nedenle bu başlığı uygulama denetleyicisine koymazsanız boş bir alan elde edersiniz.
  • Ve adamım @rafmagana , bu cevapla ve birlikte yürüdüğünüz devlerin omuzları için benimseyebileceğiniz bu heroku rehberini yazdı .

2

Hedef = '_ parent'

Kevin Vella'nın fikrini kullanarak, bu özelliği PayPal'ın düğme üreticisi tarafından yapılan form öğelerine eklemeyi denedim. Paypal'ın yeni bir tarayıcı penceresinde / sekmesinde açılmaması için benim için çalıştı.


Ne yazık ki bu safari için de işe yaramıyor.
Wtower

1

Ne kadar alakalı olduğundan emin değilim, ama bunun için bir çözüm buldum. Sitemde, URL'yi yükleyen bir iframe içeren kalıcı bir pencerede bağlantı görüntülemek istedim.

Yaptığım, bu javascript işlevine bağlantının click olayını bağladım. Tüm bunlar, URL'yi kalıcı pencereye yüklemeye veya yönlendirmeye karar vermeden önce X-FRAME-Options için URL başlıklarını kontrol eden bir PHP dosyasına istekte bulunur.

İşte işlevi:

  function opentheater(link, title){
        $.get( "url_origin_helper.php?url="+encodeURIComponent(link), function( data ) {
  if(data == "ya"){
      $(".modal-title").html("<h3 style='color:480060;'>"+title+"&nbsp;&nbsp;&nbsp;<small>"+link+"</small></h3>");
        $("#linkcontent").attr("src", link);
        $("#myModal").modal("show");
  }
  else{
      window.location.href = link;
      //alert(data);
  }
});


        }

Bunu kontrol eden PHP dosya kodu şöyledir:

<?php
$url = rawurldecode($_REQUEST['url']);
$header = get_headers($url, 1);
if(array_key_exists("X-Frame-Options", $header)){
    echo "nein";
}
else{
    echo "ya";
}


?>

Bu yardımcı olur umarım.


1

Bir wordpress web sitesi çalıştırırken bu sorunla karşılaştım. Bunu düzeltmek için her türlü şeyi denedim ve nihayetinde sorunun maskeleme ile DNS iletimi kullandığımdan ve harici sitelere olan bağlantıların doğru bir şekilde ele alınmadığından emin değildim. yani sitem http: //123.456.789/index.html adresinde barındırılıyor ancak http://somewebSite.com/index.html adresinde çalışacak şekilde maskelenmiş . Girdiğimde http: //123.456.789/index.html bu aynı linklere tarayıcı tıklayarak JS konsolunda hiç X kasalı-kökenleri konularda sonuçlandı, ama motor http://somewebSite.com/index.html yaptı. Düzgün bir şekilde maskelemek için, barındırıcınızın DNS ad sunucularını alan adı hizmetinize eklemeniz gerekir; örneğin, godaddy.com, örneğin, ns1.digitalocean.com, ns2.digitalocean.com, ns3.digitalocean.com ad sunucularına sahip olmalıdır. barındırma hizmeti olarak digitalocean.com kullanarak.


1
remove_action( 'admin_init', 'send_frame_options_header',10);
Yaptım

1

Burada hiç kimsenin Apachesunucunun ayarlarını ( *.confdosyalarını) veya .htaccessdosyanın kendisini bu hatanın nedeni olarak belirtmemesi şaşırtıcıdır . Aşağıdakilere ayarlanmadığından emin olarak sizin .htaccessveya Apacheyapılandırma dosyalarınızda arama yapın DENY:

Header always set X-Frame-Options DENY

Bunu değiştirmek SAMEORIGIN, işlerin beklendiği gibi çalışmasını sağlar:

Header always set X-Frame-Options SAMEORIGIN


daha önce bahsedilmişti - cevabında @Jay'in yorumuna bakınız stackoverflow.com/a/6767901/1875965
Sandra

.Conf dosya başlığını her zaman X-Frame-Options SAMEORIGIN ayarlıyorum!
GeekHades

Ancak bu, başlığın yabancı sunuculardan, doğrudan istemciye geldiği soru ile nasıl ilgilidir, kendi sunucunuz bile dahil değil mi? Bir şey mi kaçırıyorum?
Sz.

1

Tek gerçek yanıt, iframe'inizde istediğiniz kaynağınızdaki başlıkları kontrol etmezseniz, proxy'yi proxy'ye bağlamaktır. Bir sunucunun istemci olarak davranmasını sağlayın, kaynağı alın, sorunlu başlıkları çıkarın, gerekirse CORS ekleyin ve ardından kendi sunucunuza ping atın.

Böyle bir vekilin nasıl yazılacağını açıklayan başka bir cevap daha var. Zor değil, ama birisinin bunu daha önce yapmış olması gerektiğinden emindim. Bir sebepten dolayı onu bulmak zordu.

Sonunda bazı kaynaklar buldum:

https://github.com/Rob--W/cors-anywhere/#documentation

^ tercih edilir. Nadir kullanıma ihtiyacınız varsa, sadece onun heroku uygulamasını kullanabileceğinizi düşünüyorum. Aksi takdirde, kendi sunucunuzda kendiniz çalıştırmak için koddur. Sınırların ne olduğuna dikkat edin.

whateverorigin.org

^ ikinci seçim, ama oldukça eski. python'da sözde daha yeni bir seçim: https://github.com/Eiledon/alloworigin

üçüncü seçenek var:

http://anyorigin.com/

Bu biraz ücretsiz kullanıma izin veriyor gibi görünüyor, ancak ödeme yapmazsanız ve yalnızca ücret ödemeniz durumunda kaldırılabileceğiniz belirli bir miktar kullanmazsanız sizi genel bir utanç listesine koyacaktır ...


0

Belirtilmemiş, ancak bazı durumlarda yardımcı olabilir:

var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
    if (xhr.readyState !== 4) return;
    if (xhr.status === 200) {
        var doc = iframe.contentWindow.document;
        doc.open();
        doc.write(xhr.responseText);
        doc.close();
    }
}
xhr.open('GET', url, true);
xhr.send(null);

0

header()İşlev yerine aşağıda verilen bu satırı kullanın .

echo "<script>window.top.location = 'https://apps.facebook.com/yourappnamespace/';</script>";

0

bu sorunu vardı ve httd.conf düzenleme çözüldü

<IfModule headers_module>
    <IfVersion >= 2.4.7 >
        Header always setifempty X-Frame-Options GOFORIT
    </IfVersion>
    <IfVersion < 2.4.7 >
        Header always merge X-Frame-Options GOFORIT
    </IfVersion>
</IfModule>

SAMEORIGIN'i GOFORIT olarak değiştirdim ve sunucuyu yeniden başlattım


-1

Bu şeyi deneyin, kimsenin bu konuyu önerdiğini düşünmüyorum, bu sorunun% 70'i gibi çözülecek, diğer bazı sayfalar için hurdaya çıkmalısınız, tam çözümüm var ama kamuya açık değil,

İframe'inize aşağıya EKLE

sandbox = "izin ver aynı kökenden izin ver komut dosyalarına izin ver açılır pencereler izin ver"


1
sandboxing ayrıcalıkları azaltır, onları eklemez. bkz. html5rocks.com/tr/tutorials/security/sandboxed-iframes
Kyle Baker

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.