Https sitesinde iframe içinde http içeriğine nasıl izin verilir?


145

Bir iframe içine bazı HTML yükleyin ama başvurulan bir dosya http, https değil kullanırken, aşağıdaki hatayı alıyorum:

[bloke] {current_pagename} adresindeki sayfa, {reference_filename} kaynağından güvenli olmayan içerik yayınladı

Bunu kapatmanın herhangi bir yolu var mı veya etrafta dolaşmanın bir yolu var mı?

İframe'in bir özelliği yoktur srcve içindekiler aşağıdakiler kullanılarak ayarlanır:

frame.open();
frame.write(html);
frame.close();


düzenleme yaptı. İçerik iframe'e yazılırken src ayarlanmadı
georgephillips

1
Tüm cevaplar için teşekkürler. Uzun hikaye kısa vekil içerik.
georgephillips

@georgephillips içeriği proxy yapmak için kodu paylaşır mısınız?
Gintas_

Yanıtlar:


28

Bu sorunun genelliğine dayanarak, bazı HTTPS proxy'nizi çevrimiçi olarak bazı sunuculara kurmanız gerektiğini düşünüyorum. Aşağıdaki adımları uygulayın:

  • Proxy sunucunuzu hazırlayın - IIS'yi yükleyin, Apache
  • Güvenlik hatalarını önlemek için geçerli SSL sertifikası alın (örneğin startssl.com'dan ücretsiz)
  • Güvenli olmayan içeriği indirecek bir sarmalayıcı yazın (nasıl yapılır)
  • Sitenizden / uygulamanızdan https://yourproxy.com/?page=http://insecurepage.com adresini edinin.

Uzak site içeriğini file_get_contents veya benzer bir yöntemle indirirseniz, yine de içeriğe güvenli olmayan bağlantılarınız olabilir. Onları regex ile bulmalı ve değiştirmelisiniz. Görüntüleri çözmek zordur, ancak burada geçici bir çözüm bulundu: http://foundationphp.com/tutorials/image_proxy.php


1
İframe'in arkasındaki birçok sayfa bir iframe içine gömülmek istemediğinden ve bu nedenle X-Frame-Options Üstbilgisini SAMEORIGIN olarak ayarladığından bu çalışmaz. Proxy kullanarak bunu atlasanız bile, sayfa /insecurepage.css gibi bir şey yüklemeyi dener ve tarayıcınız alan / insecurepage.css
panzehir

135

Not: Bu çözüm, 2014 yılında yazıldığında bazı tarayıcılarda çalışmış olsa da, artık çalışmaz. iframeÇerçeve bir HTTPS URL'si ile başlasa bile, HTTPS sayfasına katıştırılmış bir HTTP URL'sinde gezinmeye veya yönlendirmeye modern tarayıcılar tarafından izin verilmez.

Oluşturduğum en iyi çözüm, google'ı ssl proxy olarak kullanmaktır ...

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

Firefox'ta test edildi ve çalışıyor.

Öbür metodlar:

  • Embed.ly gibi bir Üçüncü taraf kullanın (ancak bu yalnızca iyi bilinen http API'leri için iyidir).

  • Kontrol ettiğiniz bir https sayfasında kendi yönlendirme komut dosyanızı oluşturun (göreli bağlantılı bir sayfada basit bir javascript yönlendirmesi işe yarayacaktır. Gibi bir şey: (herhangi bir dil / yöntem kullanabilirsiniz)

    https://example.com Bunun bir iframe bağlantısı var ...

    https://example.com/utilities/redirect.html Hangi gibi basit bir js yönlendirme komut dosyası var ...

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

  • Alternatif olarak, http sitesini okumak ve https sitenizde görüntülemek için bir RSS beslemesi ekleyebilir veya okuyucu / ayrıştırıcı yazabilirsiniz.

  • Ayrıca http site sahibine bir ssl bağlantısı oluşturmasını tavsiye edebilir / etmelisiniz. Başka bir sebepten ötürü seo artarsa .

Http site sahibine bir ssl sertifikası oluşturamazsanız, en güvenli ve kalıcı çözüm, ihtiyacınız olan içeriği alan bir RSS feed'i oluşturmak olacaktır (muhtemelen http sitesinde aslında bir şey yapmıyorsunuzdur) herhangi bir sistemde oturum açmama).

Asıl sorun, bir https sitesi içinde http öğelerine sahip olmanın bir güvenlik sorununu temsil etmesidir. Bu güvenlik riski etrafında tamamen koşuşturacak yollar yoktur, bu yüzden yukarıdakiler sadece güncel çalışmalardır.

Çoğu tarayıcıda bu güvenlik önlemini devre dışı bırakabileceğinizi unutmayın (başkaları için değil, kendiniz). Ayrıca bu 'hack'lerin zamanla eski haline gelebileceğini unutmayın.


10
Harika cevap, teşekkürler. Sadece Chrome'da bildirmek için JS yönlendirme yöntemi çalışmaz sadece değişikliği önler (normalde yüklemeyi denediğinizde olduğu gibi).
georgephillips

9
Yönlendirme hilesi yalnızca Firefox'ta çalışıyor gibi görünüyor. Chrome hala güvenli olmayan içeriği yüklemeyi reddediyor. Bilinen başka geçici çözümler var mı?
Andreas Gohr

47
Sadece "Kontrol ettiğiniz bir https sayfasında kendi yönlendirme komut dosyanızı oluşturun" yönteminin artık JS kullanarak bile Chrom (e | ium) ve Firefox'un mevcut sürümleriyle çalışmadığını belirtmek istedim.
kako-nawao

17
Bu yanıt şu ana kadar geçersiz, diğer çözümler
samdd

22
Cevabın 'kullanımdan kaldırılmış' olarak etiketleme seçeneği olmalıdır. Tüm yorumları okumadığınız sürece karışıklık yaratır.
Nitin

28

Bu eski bir yazı olduğunu biliyorum, ama başka bir çözüm cURL kullanmak olacaktır, örneğin:

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;
}

sonra iframe etiketinizde, şuna benzer:

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

Bu fikri göstermek için sadece bir MINIMAL örneğidir - URL'yi sterilize etmez veya redirect.php dosyasını kendi amaçları için kullanmasını engellemez. Bunları kendi siteniz bağlamında düşünün.

Olsa da, daha esnek olmasıdır. Örneğin, göstermeden önce gerçekten istediğiniz şey olduğundan emin olmak için curl'd $ verilerinin bir doğrulamasını ekleyebilirsiniz - örneğin, 404 olmadığından emin olmak için test edin ve varsa kendi hazır içeriğinize sahip olun dır-dir.

Artı - Önemli bir şey için Javascript yönlendirmelerine güvenmekten biraz yoruldum.

Şerefe!


4
Bu oldukça işe yarıyor, ancak sitenin içindeki bağlantılar geçersiz oluyor. Örneğin, example.comSSL olan bir alanım var. example.netSSL olmayan bir iframe yerleştiriyorum . Bunun example.comgibi bir bağlantı var href="https://stackoverflow.com/path/file.html"ve tıklarken, bunun https://example.com/path/file.htmlyerine açılıyorhttp://example.net/path/file.html
Sibidharan

1
Bunun çalışmasını istiyorsanız bağlantı göreli olamaz. Başka bir deyişle, href içinde tam URL'yi belirtin. Bu dinamikse, URL'nin her bölümünü Javascript'te ve sunucu tarafında kapmak için kütüphaneler vardır.
Anthony Mason

iframe altındaki hedef sitenin css'si bozuk. Lütfen kontrol edin
Raju yourPepe

14

<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">kafasına ekle

başvuru: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

tarayıcı uyumluluğu: http://caniuse.com/#feat=upgradeinsecurerequests


23
Bu çözüm, bir https sitesinde http içeriği sunmanıza izin vermez. Bütün bunlar http isteklerini https istekleri olarak zorlamaktır. Kaynak https'de yoksa bunun yerine 404 hatası alırsınız.
Felix

Bu aslında en azından benim ihtiyaçları için çalışır .. firefox ile test ve çalışma doğruladı. Sorunum, kendi web sitem HTTPS kullanırken kaynak URL'nin HTTPS uyumluluğu olmaması.
Fernan Vecina

Chrome'da cazibe gibi çalışıyor Sürüm 76.0.3809.132 (Resmi Yapım)
Mohamed Azharuddin

8

Https sayfasında güvenli olmayan içerik görüntülemeye çalışırken çoğu tarayıcıda her zaman engellenen içerikle ilgili uyarılar alırsınız. SSL olmayan diğer sitelerden bir şeyler yerleştirmek istiyorsanız bu zordur. Uyarıları kapatabilir veya kendi tarayıcınızdaki engellemeyi kaldırabilirsiniz, ancak diğer ziyaretçiler için bu bir sorundur.

Bunu yapmanın bir yolu, içerik sunucusu tarafını yüklemek ve görüntüleri ve diğer şeyleri sunucunuza kaydetmek ve https'den görüntülemektir.

Ayrıca embed.ly gibi bir hizmeti kullanmayı deneyebilir ve içeriği bunlardan alabilirsiniz. İçeriği https'nin arkasına alma desteği var.


içeriği kazımak ve sitenizde göstermek, her zaman siteler arası komut dosyası oluşturma riskidir. Bu yüzden bir tanrı çözümü, içeriği ayrı bir URL'ye kazımak ve verileri bu URL'den bir iframe içinde https ile sunmaktır. Bu şekilde ana sitenizde ve oturum ele geçirmenizde siteler arası komut dosyası oluşturmayı önlersiniz.
Addeladde

6

Google'ı SSL proxy olarak kullanmak şu anda çalışmıyor,

Neden?

Google'dan herhangi bir sayfa açtıysanız x-frame-options, başlıkta bir alan olduğunu görürsünüz . Google yanıt başlığı

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.

(MDN'den alıntı)

Çözümlerden biri

Bu soruna yönelik çalışmam aşağıdadır:

İçeriği AWS S3'e yükleyin, kaynak için bir https bağlantısı oluşturur.
Uyarı: html dosyasının iznini herkesin görüntülemesine izin vermek için ayarlayın.

Bundan sonra src, https web sitelerinde iframe olarak kullanabiliriz . AWS


2

PHP veya başka bir sunucu tarafı dili ile ihtiyacınız olan her şeyi kazımayı deneyebilir, ardından iframe'i kazınmış içeriğe koyabilirsiniz. İşte PHP ile bir örnek:

scrapedcontent.php:

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

index.html:

<iframe src="scrapedcontent.php"></iframe>

3
JS ve CSS dosyaları, köprüler ve AJAX isteklerini içeren görüntüleri nasıl işleyeceksiniz?
dotancohen

@dotancohen haklısın, mükemmel bir çözüm değil, ama bu durum için en iyisi olduğunu düşünüyorum. Tartıştığınız sorunlara girmeyeceğiniz bazı siteler.
Grant

1
Bu işe yarar, ancak içeriği etkili bir şekilde iki katına yükler ve bu nedenle sunucunuz sıyrılır ve daha sonra içeriği yeniden
sunarken


1

Kendi HTTPS-HTTP ters proxy'nizi kullanın.

Kullanım durumunuz, içine yerleştirmek için nadiren değişen URL'lerden iframeoluşuyorsa, kendi sunucunuzda bunun için ters bir proxy ayarlayabilir ve httpssunucunuzdaki bir httpURL'nin proxy sunucusundaki bir URL ile eşleşeceği şekilde yapılandırabilirsiniz . Ters proxy tamamen sunucu tarafı olduğundan, tarayıcı gerçek web sitesinin bir proxy'si ile "sadece" konuştuğunu bulamaz ve bu nedenle proxy bağlantısı SSL'yi doğru kullandığından şikayet etmeyecektir.

Örneğin, web sunucunuz olarak Apache2 kullanıyorsanız, ters proxy oluşturmak için bu talimatlara bakın .


1
mitmproxyüretim proxy sistemi değil, bir hata ayıklama aracıdır. ngroktünelleme hizmeti, çoğunlukla geliştirme sunucuları için, bunun için nasıl yararlı olabileceğini anlamıyorum.
kolen

@kolen Bu araçlarla ilgili değil, bunun için ters bir proxy kullanma fikri, henüz diğer cevaplarda belirtilmemiş. Şimdi Apache'ye geçmek, bu da ters proxy yapmak için çok daha yaygın bir yoldur.
tanius
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.