Cara mengizinkan konten http dalam iframe di situs https

145

Saya memuat beberapa HTML ke iframe tetapi ketika file yang direferensikan menggunakan http, bukan https, saya mendapatkan kesalahan berikut:

[diblokir] Halaman di {current_pagename} menjalankan konten tidak aman dari {referenced_filename}

Apakah ada cara untuk mematikan ini atau cara untuk mengatasinya?

Iframe tidak memiliki srcatribut dan konten diatur menggunakan:

frame.open();
frame.write(html);
frame.close();
georgephillips
sumber
melakukan edit.
Src
1
Terima kasih atas semua jawabannya. Singkat cerita adalah proksi konten.
georgephillips
@georgephillips, bisakah Anda membagikan kode untuk proksi konten?
Gintas_

Jawaban:

28

Berdasarkan generalitas dari pertanyaan ini, saya pikir, bahwa Anda perlu mengatur proxy HTTPS Anda sendiri pada beberapa server online. Lakukan langkah-langkah berikut:

  • Siapkan server proxy Anda - instal IIS, Apache
  • Dapatkan sertifikat SSL yang valid untuk menghindari kesalahan keamanan (misalnya, gratis dari startssl.com)
  • Tulis bungkus, yang akan mengunduh konten tidak aman (caranya di bawah)
  • Dari situs / aplikasi Anda, dapatkan https://yourproxy.com/?page=http://insecurepage.com

Jika Anda hanya mengunduh konten situs jarak jauh melalui file_get_contents atau serupa, Anda masih dapat memiliki tautan tidak aman ke konten. Anda harus menemukannya dengan regex dan juga mengganti. Gambar sulit dipecahkan, tetapi Ï menemukan solusi di sini: http://foundationphp.com/tutorials/image_proxy.php

panpernicek
sumber
1
Ini tidak akan berfungsi, karena banyak halaman di belakang iframe tidak ingin disematkan dalam iframe dan dengan demikian mengatur X-Frame-Options Header ke SAMAORIGIN. Bahkan jika Anda dapat mem-bypass ini menggunakan proxy, halaman tersebut akan mencoba memuat sesuatu seperti /insecurepage.css dan browser Anda akan meminta domain / insecurepage.css
penawar racun
135

Catatan: Meskipun solusi ini mungkin berfungsi di beberapa browser saat ditulis pada tahun 2014, solusi ini tidak lagi berfungsi. Menavigasi atau mengalihkan ke URL HTTP dalam sebuah iframetertanam di halaman HTTPS tidak diizinkan oleh browser modern, bahkan jika frame dimulai dengan URL HTTPS.

Solusi terbaik yang saya buat adalah cukup menggunakan google sebagai ssl proxy ...

https://www.google.com/search?q=%http://yourhttpsite.com&btnI=Im+Feeling+Lucky

Diuji dan bekerja di firefox.

Metode lain:

  • Gunakan pihak ketiga seperti embed.ly (tapi itu benar-benar hanya baik untuk http API terkenal).

  • Buat skrip pengalihan Anda sendiri pada halaman https yang Anda kontrol (pengalihan javascript sederhana pada halaman yang terhubung relatif harus melakukan trik. Sesuatu seperti: (Anda dapat menggunakan langauge / metode)

    https://example.com Itu memiliki iframe yang menghubungkan ke ...

    https://example.com/utilities/redirect.html Yang memiliki skrip pengalihan js sederhana seperti ...

    document.location.href ="http://thenonsslsite.com";

  • Atau, Anda dapat menambahkan umpan RSS atau menulis pembaca / pengurai untuk membaca situs http dan menampilkannya di dalam situs https Anda.

  • Anda dapat / sebaiknya juga merekomendasikan kepada pemilik situs http bahwa mereka membuat koneksi ssl. Jika tanpa alasan lain selain meningkatkan seo .

Kecuali Anda dapat membuat pemilik situs http untuk membuat sertifikat ssl, solusi paling aman dan permanen adalah membuat umpan RSS yang mengambil konten yang Anda butuhkan (mungkin Anda sebenarnya tidak 'melakukan' apa pun di situs http -yaitu untuk katakanlah tidak masuk ke sistem apa pun).

Masalah sebenarnya adalah bahwa memiliki elemen http di dalam situs https merupakan masalah keamanan. Tidak ada cara yang benar-benar halal di sekitar risiko keamanan ini sehingga hal di atas hanyalah pekerjaan saat ini.

Perhatikan, bahwa Anda dapat menonaktifkan langkah keamanan ini di sebagian besar browser (sendiri, bukan untuk orang lain). Perhatikan juga bahwa 'peretasan' ini mungkin menjadi usang seiring berjalannya waktu.

Matthew Peters
sumber
10
Jawaban yang bagus, terima kasih. Sekadar memberi tahu Anda di chrome, metode redirect JS tidak berfungsi hanya mencegah perubahan (seperti halnya saat Anda mencoba memuatnya secara normal).
georgephillips
9
Trik pengalihan tampaknya hanya berfungsi di Firefox. Chrome masih menyangkal memuat konten yang tidak aman. Apakah ada solusi lain yang diketahui?
Andreas Gohr
47
Hanya ingin memberi tahu bahwa metode "Buat skrip pengalihan Anda sendiri di laman https yang Anda kontrol" tidak lagi berfungsi dengan versi Chrom (e | ium) dan Firefox saat ini, bahkan menggunakan JS.
kako-nawao
17
Jawaban ini tidak valid hingga saat ini, solusi lain
samdd
22
Jawabannya harus memiliki opsi untuk diberi label sebagai 'usang'. Itu menciptakan kebingungan kecuali jika Anda membaca semua komentar.
Nitin
28

Saya tahu ini adalah posting lama, tetapi solusi lain adalah dengan menggunakan CURL, misalnya:

redirect.php:

<?php
if (isset($_GET['url'])) {
    $url = $_GET['url'];
    $ch = curl_init();
    $timeout = 5;
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
    $data = curl_exec($ch);
    curl_close($ch);
    echo $data;
}

lalu di tag iframe Anda, sesuatu seperti:

<iframe src="/redirect.php?url=http://www.example.com/"></iframe>

Ini hanya contoh MINIMAL untuk mengilustrasikan ide - itu tidak membersihkan URL, juga tidak akan mencegah orang lain menggunakan redirect.php untuk tujuan mereka sendiri. Pertimbangkan hal-hal ini dalam konteks situs Anda sendiri.

Sisi baiknya adalah lebih fleksibel. Misalnya, Anda dapat menambahkan beberapa validasi dari $ data yang dikeriting untuk memastikan itu benar-benar yang Anda inginkan sebelum menampilkannya - misalnya, tes untuk memastikan itu bukan 404, dan memiliki konten pengganti yang siap Anda sendiri jika itu adalah.

Plus - Saya sedikit lelah mengandalkan pengalihan Javascript untuk hal-hal penting.

Bersulang!

David R.
sumber
4
Ini cukup berhasil, tetapi tautan di dalam situs semakin tidak valid. Misalnya, saya memiliki domain bernama example.comyang memiliki SSL. Saya menyematkan iframe dengan example.netyang tidak memiliki SSL. The example.commemiliki link seperti href="https://stackoverflow.com/path/file.html"dan sementara mengklik, itu adalah membuka sebagai https://example.com/path/file.htmlbukanhttp://example.net/path/file.html
Sibidharan
1
Tautan tidak dapat relatif jika Anda ingin ini berfungsi. Dengan kata lain, tentukan URL lengkap dalam href. Jika ini dinamis, ada perpustakaan untuk mengambil setiap segmen URL dalam Javascript serta sisi server.
Anthony Mason
css dari situs target di bawah iframe rusak. Silakan periksa
Raju yourPepe
14

tambahkan <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">kepala

referensi: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

kompatibilitas browser: http://caniuse.com/#feat=upgradeinsecurerequests

pengguna2523022
sumber
23
Solusi ini tidak memungkinkan Anda untuk menyajikan konten http di situs https. Semua ini dilakukan adalah memaksa permintaan http sebagai permintaan https. Jika sumber daya tidak ada di https Anda hanya akan mendapatkan kesalahan 404.
Felix
Ini sebenarnya berfungsi setidaknya untuk kebutuhan saya .. mengujinya dengan firefox dan dikonfirmasi berfungsi. Masalah saya adalah URL sumber bukan kepatuhan HTTPS sementara situs web saya sendiri menggunakan HTTPS.
Fernan Vecina
Bekerja seperti pesona di chrome Versi 76.0.3809.132 (Bangun Resmi)
Mohamed Azharuddin
8

Anda akan selalu mendapatkan peringatan tentang konten yang diblokir di sebagian besar browser saat mencoba menampilkan konten yang tidak aman di halaman https. Ini rumit jika Anda ingin menyematkan hal-hal dari situs lain yang tidak ketinggalan ssl. Anda dapat mematikan peringatan atau menghapus pemblokiran di browser Anda sendiri tetapi bagi pengunjung lain itu adalah masalah.

Salah satu cara untuk melakukannya adalah dengan memuat sisi server konten dan menyimpan gambar dan hal-hal lain ke server Anda dan menampilkannya dari https.

Anda juga dapat mencoba menggunakan layanan seperti embed.ly dan mendapatkan konten melalui mereka. Mereka memiliki dukungan untuk mendapatkan konten di balik https.

Addeladde
sumber
jika Anda mengikis konten dan menunjukkannya di situs Anda, itu selalu merupakan risiko skrip lintas situs. Jadi solusi tuhan adalah mengikis konten pada url terpisah dan menyajikan data dalam iframe dari url itu dengan https. Dengan cara itu Anda mencegah skrip lintas situs di situs utama dan pembajakan sesi Anda.
Addeladde
6

Menggunakan Google sebagai proxy SSL tidak berfungsi saat ini,

Mengapa?

Jika Anda membuka halaman apa pun dari google, Anda akan menemukan ada x-frame-optionsbidang di header. Tajuk respons Google

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.

(Kutipan dari MDN)

Salah satu solusinya

Di bawah ini adalah pekerjaan saya untuk masalah ini:

Unggah konten ke AWS S3, dan itu akan membuat tautan https untuk sumber.
Perhatikan: atur izin ke file html untuk memungkinkan semua orang melihatnya.

Setelah itu, kita dapat menggunakannya sebagai srciframe di situs web https. AWS

David Guan
sumber
2

Anda dapat mencoba mengikis apa pun yang Anda butuhkan dengan PHP atau bahasa sisi server lain, lalu meletakkan iframe ke konten yang dikikis. Berikut ini contoh dengan PHP:

scrapedcontent.php:

<?php
$homepage = file_get_contents('http://www.example.com/');
echo $homepage;
?>

index.html:

<iframe src="scrapedcontent.php"></iframe>
Hibah
sumber
3
Bagaimana Anda menangani gambar, termasuk file JS dan CSS, hyperlink, dan permintaan AJAX?
dotancohen
@dotancohen Anda benar, itu bukan solusi yang sempurna, tapi saya pikir itu yang terbaik untuk situasi ini. Beberapa situs Anda tidak akan mengalami masalah yang Anda diskusikan.
Berikan
1
Ini berfungsi, tetapi secara efektif memuat dua kali konten dan karenanya memuat waktu ketika server Anda mengikis dan kemudian menayangkan kembali konten ...
ChristoKiwi
1

Gunakan proksi balik HTTPS-ke-HTTP Anda sendiri.

Jika use case Anda adalah tentang beberapa, jarang mengubah URL untuk dimasukkan ke dalam iframe, Anda hanya dapat mengatur proxy terbalik untuk ini di server Anda sendiri dan mengkonfigurasinya sehingga satu httpsURL di server Anda memetakan ke satu httpURL di server proksi. Karena proxy terbalik sepenuhnya berada di sisi server, browser tidak dapat menemukan bahwa itu "hanya" berbicara ke proxy situs web asli, dan karenanya tidak akan mengeluh karena koneksi ke proxy menggunakan SSL dengan benar.

Jika misalnya Anda menggunakan Apache2 sebagai server web Anda, maka lihat instruksi ini untuk membuat proxy terbalik.

tanius
sumber
1
mitmproxyadalah alat debugging, bukan sistem proksi produksi. ngrokadalah layanan tunneling, sebagian besar untuk server pengembangan, saya tidak mengerti bagaimana ini bisa berguna untuk ini.
kolen
@ Kolen Ini bukan tentang alat, ini tentang gagasan menggunakan proxy terbalik untuk ini, belum disebutkan dalam jawaban lain. Mengubah ke Apache sekarang, yang merupakan cara yang jauh lebih umum untuk melakukan proxy terbalik.
tanius