İframe'de 'X-Frame-Options' nasıl ayarlanır?


170

Eğer iframeböyle bir şey oluşturursam :

var dialog = $('<div id="' + dialogId + '" align="center"><iframe id="' + frameId + '" src="' + url + '" width="100%" frameborder="0" height="'+frameHeightForIe8+'" data-ssotoken="' + token + '"></iframe></div>').dialog({

Hatayı nasıl düzeltebilirim:

'https://www.google.com.ua/?gws_rd=ssl''X-Frame-Options'ı' SAMEORIGIN 'olarak ayarladığından bir çerçevede görüntülenmeyi reddetti .

JavaScript ile?

Yanıtlar:


227

Sen ayarlayamıyor X-Frame-Optionsüzerinde iframe. Bu, kaynağı talep ettiğiniz etki alanı tarafından ayarlanan bir yanıt başlığıdır ( google.com.uaörneğinizde). SAMEORIGINBu durumda üstbilgiyi ayarlamışlardır; bu, kaynağın alan iframeadlarının dışına yüklenmesine izin vermedikleri anlamına gelir . Daha fazla bilgi için bkz . MDN'deki X-Frame-Options yanıt başlığı .

Başlıkların hızlı bir şekilde incelenmesi (burada Chrome geliştirici araçlarında gösterilmiştir) X-Frame-Optionsana bilgisayardan döndürülen değeri gösterir.

resim açıklamasını buraya girin


7
YouTube ile bitiş noktası URL'sini "yerleştirme" sürümüne değiştirebilirsiniz. Bkz. Stackoverflow.com/questions/25661182/… (Bunun kesinlikle OP'nin aradığı şey olmadığını biliyorum, ancak google önce bu sonucu veriyor!)

73

X-Frame-Optionsistenen alan adının bir çerçeve içinde görüntülenmesine izin verip vermeyeceğini belirtme isteğine verilen yanıtta yer alan bir başlıktır . Javascript veya HTML ile ilgisi yoktur ve isteğin kaynağı tarafından değiştirilemez.

Bu web sitesi, bu üstbilgiyi, öğesinde görüntülenmesine izin vermeyecek şekilde ayarladı iframe. İstemcinin bu davranışı durdurmak için yapabileceği hiçbir şey yoktur.

X-Frame-Options hakkında daha fazla bilgi


Yanıt üstbilgisinde ayarlanır, üstbilgi istemez. Ama aksi halde doğru bir açıklama!
nickang

2
@nickang demek istediğim bu, ancak terminolojinin açık olmadığını kabul ediyorum. Herhangi bir karışıklığı gidermek için düzenledim. Teşekkürler.
Rory McCrossan

31

İframe içeriğini gönderen Sunucunun kontrolünde olmanız durumunda, ayarı X-Frame-Optionsweb sunucunuzda yapabilirsiniz.

Apache'yi Yapılandırma

Tüm sayfalar için X-Frame-Options üstbilgisini göndermek için bunu sitenizin yapılandırmasına ekleyin:

Header always append X-Frame-Options SAMEORIGIN

Nginx'i yapılandırma

Nginx'i X-Frame-Options üstbilgisini gönderecek şekilde yapılandırmak için, bunu http, sunucu veya konum yapılandırmanıza ekleyin:

add_header X-Frame-Options SAMEORIGIN;

Yapılandırma yok

Bu başlık seçeneği isteğe bağlıdır, bu nedenle seçenek hiç ayarlanmadıysa, bunu bir sonraki örneğe yapılandırma seçeneği sunarsınız (örneğin, ziyaretçi tarayıcısı veya proxy)

kaynak: https://developer.mozilla.org/en-US/docs/Web/HTTP/X-Frame-Options


Bu bana yardımcı oldu. Bu iki satırı add_header Strict-Transport-Security "max-age=86400; includeSubdomains"; add_header X-Frame-Options DENY;yorumluyorum : nginx-snippet'lerinden ve hemen çalıştı.
Zeth

NGINX, nerede olduğunu söylemek önemli , içeride mi?
Peter Krauss

Peter Kraus, ne istiyorsun?
rubo77

14

Çözüm sunucu tarafı için gerçekten bahsedilmediğinden:

Biri böyle şeyleri ayarlamalıdır (apache'den örnek), bu her şeyde izin verdiği gibi en iyi seçenek değildir, ancak sunucunuzun doğru çalıştığını gördükten sonra ayarları kolayca değiştirebilirsiniz.

           Header set Access-Control-Allow-Origin "*"
           Header set X-Frame-Options "allow-from *"

5

pek değil ... kullandım

 <system.webServer>
     <httpProtocol allowKeepAlive="true" >
       <customHeaders>
         <add name="X-Frame-Options" value="*" />
       </customHeaders>
     </httpProtocol>
 </system.webServer>

Bu bir çözüm gibi görünüyor, ancak bu bir güvenlik ihlali mi?
Yogurtu

1
Bu var değil size tam olarak ne yaptığını bilmeden Siteniz için devre dışı aynı kökenli politikası için iyi bir fikir. Sizinkinden farklı alan adlarının içerik yerleştirmesine izin vermemelisiniz. Bkz. Codecademy.com/articles/what-corcors ve benzeri eğitimler.
slhck


2

X-Frame-Options HTTP yanıt başlığı Bir tarayıcı içinde sayfayı görüntülemeye izin verilmelidir olup olmadığını belirtmek için kullanılabilir <frame>, <iframe>ya da<object> . Siteler, içeriklerinin başka sitelere yerleştirilmediğinden emin olarak, tıklama saldırılarını önlemek için bunu kullanabilir.

Daha Fazla Bilgi için: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

Ben PHP kullanarak göstereceğim bu sorun için alternatif bir çözüm var:

iframe.php:

<iframe src="target_url.php" width="925" height="2400" frameborder="0" ></iframe>

target_url.php:

<?php 
  echo file_get_contents("http://www.example.com");
?>

5
Bu, yüklendikten sonra sayfayı kullanmak için uygun bir çözüm müdür? İlk yükleme sonrasında sayfalarla etkileşime girebilecek miyim? Alan yüklendikten sonra içeriği kullanabilmek için her alan adı isteğinin proxy yapılması gerekmez mi?
Timothy Gonzalez

0

Bu amaçla, apache'nizdeki konumu veya kullandığınız diğer hizmetleri eşleştirmeniz gerekir

Apache kullanıyorsanız httpd.conf dosyasında.

  <LocationMatch "/your_relative_path">
      ProxyPass absolute_path_of_your_application/your_relative_path
      ProxyPassReverse absolute_path_of_your_application/your_relative_path
   </LocationMatch>

0

Çözüm bir tarayıcı eklentisi kurmaktır.

HTTP Üstbilgisi X-Frame-Optionsdeğerini DENY(veya SAMEORIGINfarklı bir sunucu kaynağıyla) yayınlayan bir web sitesi , IFRAME'ye entegre edilemez ... Bu davranışı, X-Frame-OptionsBaşlığı yok sayan bir Tarayıcı eklentisi yükleyerek değiştirmezseniz (ör. Chrome'un X-Frame Üstbilgilerini Yoksay) ).

Bunun güvenlik nedeniyle hiç önerilmediğini unutmayın.


0

iframe içine yüklemek istediğiniz sitenin web yapılandırmasında x-frame-seçeneğini bu şekilde ayarlayabilirsiniz

<httpProtocol>
    <customHeaders>
      <add name="X-Frame-Options" value="*" />
    </customHeaders>
  </httpProtocol>

stackoverflow'u açmak istersem, web yapılandırmasını nerede bulabilirim? sunucu tarafı için değil mi?
irum zahra

0

(Bu sorunu yeniden canlandırıyorum çünkü bu sorunu çözmek için oluşturduğum geçici çözümü paylaşmak istiyorum)

<iframe>Öğe içinde sunmak istediğiniz web sayfasını barındıran web sitesine erişiminiz yoksa X-Frame-Options, web sunucusundan web sayfalarını isteyebilecek CORS etkin bir ters proxy kullanarak SAMEORIGIN kısıtlamalarını aşabilirsiniz ( ve son kullanıcıya sunun.

İşte kavramın görsel bir şeması:

resim açıklamasını buraya girin

Bulduğum CORS vekillerinden memnun olmadığım için, kendim bir tane oluşturdum. yarattım CORSflare olarak : bir Cloudflare İşçisinde çalışmak üzere tasarlandı (sunucusuz bilgi işlem) , bu yüzden% 100 ücretsiz bir geçici çözüm günde 100.000'den fazla talebi kabul etmesine gerek yok.

Proxy kaynak kodunu GitHub'da bulabilirsiniz ; kurulum talimatı da dahil olmak üzere tüm dokümantasyon blogumun bu yayınında bulunabilir .


-1

X-iframe'i, site sahibi tarafından sağlanması gerektiği ve sunucu kuralları dahilinde olduğu için HTML gövdesine gerçekten ekleyemezsiniz.

Muhtemelen yapabileceğiniz, hedef URL içeriğini yükleyen bir PHP dosyası oluşturmak ve bu php URL iframe, bu sorunsuz çalışması gerekir.


1
"Muhtemelen" sonra cevap değilse yorum olarak gönderin
MK

Bir cevap olduğu ortaya çıkarsa MK
Sushant Chaudhari

Sonra belirli bir çözüm değil, işe yarayan bir öneri, bu yüzden bir yorum olarak yerleştirilmelidir
MK

-2

bunu tomcat örnek düzeyinde yapılandırma dosyasında (web.xml) web.xml yapılandırma dosyasına 'filtre' ve filtre eşleme 'eklemeniz gerekir. bu, global bir ayar olduğu için tüm sayfaya [X-frame-options = DENY] ekler.

<filter>
        <filter-name>httpHeaderSecurity</filter-name>
        <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
          <param-name>antiClickJackingEnabled</param-name>
          <param-value>true</param-value>
        </init-param>
        <init-param>
          <param-name>antiClickJackingOption</param-name>
          <param-value>DENY</param-value>
        </init-param>
    </filter>

  <filter-mapping> 
    <filter-name>httpHeaderSecurity</filter-name> 
    <url-pattern>/*</url-pattern>
</filter-mapping>

-3

Xml yaklaşımını izliyorsanız, aşağıdaki kod işe yarayacaktır.

    <security:headers>
        <security:frame-options />
        <security:cache-control />
        <security:content-type-options />
        <security:xss-protection />
    </security:headers>
<security:http>
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.