Bagaimana cara mengatur 'X-Frame-Options' di iframe?


170

Jika saya membuat yang iframeseperti ini:

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

Bagaimana saya bisa memperbaiki kesalahan:

Menolak untuk ditampilkan 'https://www.google.com.ua/?gws_rd=ssl'dalam bingkai karena mengatur 'X-Frame-Options' ke 'SAMAORIGIN'.

dengan JavaScript?

Jawaban:


227

Anda tidak dapat mengatur X-Frame-Optionsdi iframe. Itu adalah tajuk respons yang ditetapkan oleh domain tempat Anda meminta sumber daya ( google.com.uadalam contoh Anda). Mereka telah mengatur tajuk SAMEORIGINdalam hal ini, yang berarti bahwa mereka telah melarang pemuatan sumber daya di iframeluar domain mereka. Untuk informasi lebih lanjut, lihat tajuk respons X-Frame-Options di MDN.

Pemeriksaan cepat header (ditampilkan di sini di alat pengembang Chrome) mengungkapkan X-Frame-Optionsnilai yang dikembalikan dari host.

masukkan deskripsi gambar di sini


7
Dengan YouTube, Anda dapat mengubah URL titik akhir ke versi "sematkan". Lihat stackoverflow.com/questions/25661182/… (Saya tahu ini tidak sepenuhnya apa yang dicari OP, tetapi google memberikan hasil ini pertama!)

73

X-Frame-Optionsadalah tajuk yang disertakan dalam respons terhadap permintaan untuk menyatakan jika domain yang diminta akan memungkinkan dirinya untuk ditampilkan dalam bingkai. Itu tidak ada hubungannya dengan javascript atau HTML, dan tidak dapat diubah oleh pencetus permintaan.

Situs web ini telah menetapkan tajuk ini untuk melarangnya ditampilkan di iframe. Tidak ada yang dapat dilakukan klien untuk menghentikan perilaku ini.

Bacaan lebih lanjut tentang X-Frame-Options


Sudah diatur di header respons, bukan header permintaan. Tetapi penjelasan sebaliknya akurat!
nickang

2
@nickang, itulah yang saya maksudkan, namun saya setuju terminologinya tidak jelas. Saya telah mengeditnya untuk menghilangkan kebingungan. Terima kasih.
Rory McCrossan

31

Jika Anda mengendalikan Server yang mengirimkan konten iframe, Anda dapat mengatur pengaturan X-Frame-Optionsdi server web Anda.

Mengkonfigurasi Apache

Untuk mengirim header X-Frame-Options untuk semua halaman, tambahkan ini ke konfigurasi situs Anda:

Header always append X-Frame-Options SAMEORIGIN

Mengkonfigurasi nginx

Untuk mengkonfigurasi nginx untuk mengirim header X-Frame-Options, tambahkan ini ke konfigurasi http, server atau lokasi Anda:

add_header X-Frame-Options SAMEORIGIN;

Tidak ada konfigurasi

Opsi tajuk ini bersifat opsional, jadi jika opsi ini tidak disetel sama sekali, Anda akan memberikan opsi untuk mengonfigurasikannya ke instance berikutnya (mis. Browser pengunjung atau proxy)

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


Ini membantu saya. Saya berkomentar dua baris ini: add_header Strict-Transport-Security "max-age=86400; includeSubdomains"; add_header X-Frame-Options DENY;dari nginx-snippets, dan kemudian langsung bekerja.
Zeth

NGINX, penting dikatakan di mana , di dalam lokasi?
Peter Krauss

Peter Kraus, apa yang kamu inginkan?
rubo77

14

Karena solusinya tidak benar-benar disebutkan untuk sisi server:

Kita harus mengatur hal-hal seperti ini (contoh dari apache), ini bukan opsi terbaik karena memungkinkan dalam segala hal, tetapi setelah Anda melihat server Anda bekerja dengan benar Anda dapat dengan mudah mengubah pengaturan.

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

5

tidak terlalu ... saya menggunakan

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

Ini terlihat seperti solusi, tetapi apakah ini pelanggaran keamanan?
Yogurtu

1
Ini bukan ide yang baik untuk menonaktifkan kebijakan asal yang sama untuk situs Anda kecuali Anda tahu persis apa yang Anda lakukan. Anda seharusnya tidak mengizinkan domain yang berbeda dari milik Anda untuk menyematkan konten. Lihat codecademy.com/articles/what-is-cors dan tutorial serupa.
slhck


2

Header respons HTTP X-Frame-Options dapat digunakan untuk menunjukkan apakah browser boleh atau tidak merender halaman dalam <frame>, <iframe>atau <object>. Situs dapat menggunakan ini untuk menghindari serangan clickjacking, dengan memastikan bahwa konten mereka tidak tertanam ke situs lain.

Untuk Informasi Lebih Lanjut: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options

Saya punya solusi alternatif untuk masalah ini, yang akan saya tunjukkan dengan menggunakan PHP:

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
Apakah ini solusi yang layak untuk menggunakan halaman setelah dimuat? Apakah saya dapat berinteraksi dengan halaman setelah inital load? Tidakkah setiap permintaan untuk domain harus diproksi agar dapat menggunakan konten setelah dimuat?
Timothy Gonzalez

0

Untuk tujuan ini, Anda harus mencocokkan lokasi di apache atau layanan lain yang Anda gunakan

Jika Anda menggunakan apache maka dalam file httpd.conf.

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

0

Solusinya adalah dengan menginstal plugin browser.

Situs web yang menerbitkan HTTP Header X-Frame-Optionsdengan nilai DENY(atau SAMEORIGINdengan asal server yang berbeda) tidak dapat diintegrasikan ke dalam IFRAME ... kecuali Anda mengubah perilaku ini dengan menginstal plugin Browser yang mengabaikan X-Frame-OptionsHeader (mis. Header Frame X Abaikan Chrome ).

Perhatikan bahwa ini tidak direkomendasikan sama sekali untuk alasan keamanan.


0

Anda dapat mengatur opsi x-frame-dalam konfigurasi web dari situs yang ingin Anda buka iframe seperti ini

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

jika saya ingin membuka stackoverflow, di mana saya dapat menemukan konfigurasi web? bukan untuk sisi server?
irum zahra

-1

Anda tidak dapat benar-benar menambahkan x-iframe di tubuh HTML Anda karena harus disediakan oleh pemilik situs dan itu berada dalam aturan server.

Apa yang mungkin dapat Anda lakukan adalah membuat file PHP yang memuat konten URL target dan iframe URL php itu, ini harus bekerja dengan lancar.


1
"Anda mungkin dapat" lalu mempostingnya sebagai komentar jika bukan jawaban
MK

Bagaimana jika ternyata itu adalah jawaban MK
Sushant Chaudhari

Maka itu adalah saran yang berhasil, bukan solusi spesifik, sehingga harus ditempatkan sebagai komentar
MK

-2

Anda dapat melakukannya di tomcat instance level config file (web.xml) perlu menambahkan 'filter' dan filter-mapping 'di file konfigurasi web.xml. ini akan menambahkan [X-frame-options = DENY] di semua halaman karena merupakan pengaturan global.

<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

Jika Anda mengikuti pendekatan xml, maka kode di bawah ini akan berfungsi.

    <security:headers>
        <security:frame-options />
        <security:cache-control />
        <security:content-type-options />
        <security:xss-protection />
    </security:headers>
<security:http>
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.