วิธีอนุญาตเนื้อหา http ภายใน iframe บนเว็บไซต์ https


145

ฉันโหลด HTML บางส่วนลงใน iframe แต่เมื่อไฟล์อ้างอิงใช้ http ไม่ใช่ https ฉันได้รับข้อผิดพลาดต่อไปนี้:

[ถูกบล็อก] หน้าเว็บที่ {current_pagename} เรียกใช้เนื้อหาที่ไม่ปลอดภัยจาก {referenced_filename}

มีวิธีใดบ้างที่จะปิดสิ่งนี้หรือวิธีใด ๆ

iframe ไม่มีsrcแอ็ตทริบิวต์และเนื้อหาถูกตั้งค่าโดยใช้:

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


แก้ไขแล้ว src ไม่ได้ถูกตั้งค่าเนื่องจากเนื้อหาถูกเขียนลงใน iframe
georgephillips

1
ขอบคุณสำหรับคำตอบทั้งหมด เรื่องสั้นสั้นเป็นเนื้อหาของพรอกซี
georgephillips

@georgephillips คุณจะแบ่งปันรหัสเพื่อการแสดงเนื้อหาหรือไม่
Gintas_

คำตอบ:


28

ฉันคิดว่าคุณจะต้องตั้งค่าพรอกซี HTTPS ของคุณเองบนเซิร์ฟเวอร์ทั่วไปบางแห่ง ทำตามขั้นตอนต่อไปนี้:

  • เตรียมพร็อกซีเซิร์ฟเวอร์ของคุณ - ติดตั้ง IIS, Apache
  • รับใบรับรอง SSL ที่ถูกต้องเพื่อหลีกเลี่ยงข้อผิดพลาดด้านความปลอดภัย (เช่นจากslslsl.com)
  • เขียน wrapper ซึ่งจะดาวน์โหลดเนื้อหาที่ไม่ปลอดภัย (วิธีการด้านล่าง)
  • จากเว็บไซต์ / แอปของคุณรับhttps://yourproxy.com/?page=http://insecurepage.com

หากคุณเพียงแค่ดาวน์โหลดเนื้อหาของไซต์ระยะไกลผ่าน file_get_contents หรือคล้ายกันคุณยังสามารถมีลิงก์ที่ไม่ปลอดภัยไปยังเนื้อหา คุณจะต้องค้นหาพวกเขาด้วย regex และแทนที่ รูปภาพยากที่จะแก้ไข แต่Ïพบวิธีแก้ปัญหาที่นี่: http://foundationphp.com/tutorials/image_proxy.php


1
สิ่งนี้จะไม่ทำงานเนื่องจากหน้าเว็บหลายหลังที่อยู่ด้านหลัง iframe ไม่ต้องการให้ฝังลงใน iframe ดังนั้นจึงตั้งค่าส่วนหัว X-Frame-Options เป็น SAMEORIGIN แม้ว่าคุณจะสามารถเลี่ยงผ่านสิ่งนี้ได้โดยใช้พร็อกซีหน้านั้นจะพยายามโหลดบางอย่างเช่น /insecurepage.css และเบราว์เซอร์ของคุณจะขอโดเมน / insecurepage.css ของคุณ
antidote

135

หมายเหตุ:แม้ว่าวิธีนี้อาจใช้งานได้ในเบราว์เซอร์บางตัวเมื่อเขียนในปี 2014 แต่ก็ไม่สามารถใช้งานได้อีกต่อไป ไม่อนุญาตการนำทางหรือเปลี่ยนเส้นทางไปยัง URL HTTP ในiframeหน้า HTTPS ในเบราว์เซอร์สมัยใหม่แม้ว่าเฟรมจะเริ่มต้นด้วย HTTPS URL ก็ตาม

ทางออกที่ดีที่สุดที่ฉันสร้างคือใช้ google เป็น ssl proxy ...

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

ผ่านการทดสอบและทำงานใน firefox

วิธีอื่น ๆ :

  • ใช้บุคคลที่สามเช่น embed.ly (แต่จริง ๆ แล้วมันดีสำหรับ http API ที่รู้จักกันดีเท่านั้น)

  • สร้างสคริปต์การเปลี่ยนเส้นทางของคุณเองในหน้า https ที่คุณควบคุม (การเปลี่ยนเส้นทาง JavaScript แบบง่ายบนหน้าเว็บที่เชื่อมโยงแบบสัมพัทธ์ควรจะทำสิ่งที่ต้องการ: (คุณสามารถใช้วิธีการ / วิธีการใดก็ได้)

    https://example.com ที่มี iframe เชื่อมโยงไปยัง ...

    https://example.com/utilities/redirect.html ซึ่งมีสคริปต์การเปลี่ยนเส้นทาง js อย่างง่ายเช่น ...

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

  • อีกทางหนึ่งคุณสามารถเพิ่มฟีด RSS หรือเขียนโปรแกรมอ่าน / วิเคราะห์คำเพื่ออ่านเว็บไซต์ http และแสดงภายในเว็บไซต์ https ของคุณ

  • คุณสามารถ / ควรแนะนำให้เจ้าของเว็บไซต์ http ว่าพวกเขาสร้างการเชื่อมต่อ ssl ถ้าไม่มีเหตุผลอย่างอื่นมากกว่ามันจะเพิ่ม SEO

หากคุณไม่ได้รับเจ้าของไซต์ http เพื่อสร้างใบรับรอง SSL วิธีที่ปลอดภัยและถาวรที่สุดคือการสร้างฟีด RSS เพื่อดึงเนื้อหาที่คุณต้องการ (สมมุติว่าคุณไม่ได้ทำอะไรเลยบนไซต์ http - นั่นคือ พูดไม่ได้เข้าสู่ระบบใด ๆ )

ปัญหาที่แท้จริงคือการมีองค์ประกอบ http ภายในเว็บไซต์ https หมายถึงปัญหาด้านความปลอดภัย ความเสี่ยงด้านความปลอดภัยนี้ไม่มีโคเชอร์ที่สมบูรณ์ดังนั้นข้างต้นเป็นเพียงการทำงานในปัจจุบัน

โปรดทราบว่าคุณสามารถปิดใช้งานมาตรการรักษาความปลอดภัยนี้ในเบราว์เซอร์ส่วนใหญ่ (ตัวคุณเองไม่ใช่เพื่อคนอื่น) นอกจากนี้โปรดทราบว่า 'แฮ็ก' เหล่านี้อาจล้าสมัยเมื่อเวลาผ่านไป


10
คำตอบที่ดีขอบคุณ เพียงเพื่อแจ้งให้คุณทราบใน chrome วิธีการเปลี่ยนเส้นทาง JS ไม่ทำงานเพียงป้องกันการเปลี่ยนแปลง (เช่นเมื่อคุณลองโหลดตามปกติ)
georgephillips

9
เคล็ดลับการเปลี่ยนเส้นทางดูเหมือนว่าจะทำงานใน Firefox เท่านั้น Chrome ยังคงปฏิเสธการโหลดเนื้อหาที่ไม่ปลอดภัย มีวิธีแก้ไขปัญหาอื่น ๆ ที่รู้จักหรือไม่?
Andreas Gohr

47
เพิ่งต้องการส่งสัญญาณว่าวิธี "สร้างสคริปต์การเปลี่ยนเส้นทางของคุณเองในหน้า https ที่คุณควบคุม" ไม่สามารถใช้งานกับ Chrom ปัจจุบัน (e | ium) และ Firefox แม้จะใช้ JS
kako-nawao

17
คำตอบนี้ไม่ถูกต้องถึงวันที่โซลูชั่นอื่น ๆ
samdd

22
คำตอบควรมีตัวเลือกที่จะติดป้ายกำกับว่า มันสร้างความสับสนเว้นแต่คุณจะอ่านความคิดเห็นทั้งหมด
Nitin

28

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่วิธีแก้ไขปัญหาอื่นจะใช้ cURL ตัวอย่างเช่น:

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

จากนั้นในแท็ก iframe ของคุณสิ่งที่ชอบ:

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

นี่เป็นเพียงตัวอย่างเล็กน้อยเพื่อแสดงแนวคิด - มันไม่ได้ทำความสะอาด URL และจะป้องกันไม่ให้ผู้อื่นใช้ redirect.php เพื่อจุดประสงค์ของพวกเขา พิจารณาสิ่งเหล่านี้ในบริบทของเว็บไซต์ของคุณเอง

แต่กลับหัวกลับหางมีความยืดหยุ่นมากขึ้น ตัวอย่างเช่นคุณสามารถเพิ่มการตรวจสอบความถูกต้องของข้อมูล $ curl'd เพื่อให้แน่ใจว่าเป็นสิ่งที่คุณต้องการก่อนที่จะแสดง - ตัวอย่างเช่นทดสอบเพื่อให้แน่ใจว่าไม่ใช่ 404 และมีเนื้อหาสำรองของคุณเองถ้าพร้อม คือ.

บวก - ฉันรู้สึกเหนื่อยเล็กน้อยที่ต้องพึ่งพาการเปลี่ยนเส้นทาง Javascript สำหรับสิ่งที่สำคัญ

ไชโย!


4
มันใช้งานได้ดี แต่ลิงค์ภายในเว็บไซต์เริ่มมีปัญหา ตัวอย่างเช่นฉันมีโดเมนชื่อexample.comที่มี SSL ฉันกำลังฝัง iframe example.netที่ไม่มี SSL example.comลิงก์ดังกล่าวมีลักษณะเหมือนhref="https://stackoverflow.com/path/file.html"และขณะที่คลิกมันจะเปิดhttps://example.com/path/file.htmlแทนhttp://example.net/path/file.html
Sibidharan

1
ลิงก์ไม่สามารถสัมพันธ์กันได้หากคุณต้องการให้มันใช้งานได้ กล่าวอีกนัยหนึ่งระบุ URL แบบเต็มภายใน href หากเป็นแบบไดนามิกมีห้องสมุดที่จะคว้าแต่ละส่วนของ URL ใน Javascript เช่นเดียวกับฝั่งเซิร์ฟเวอร์
Anthony Mason

css ของเว็บไซต์เป้าหมายภายใต้ iframe เสียหาย กรุณาตรวจสอบ
Raju yourPepe

14

เพิ่ม<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">ในหัว

การอ้างอิง: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

ความเข้ากันได้ของเบราว์เซอร์: http://caniuse.com/#feat=upgradeinsecurerequests


23
โซลูชันนี้ไม่อนุญาตให้คุณแสดงเนื้อหา http บนเว็บไซต์ https ทั้งหมดนี้ทำคือบังคับให้คำขอ http เป็นคำขอ https หากไม่มีทรัพยากรบน https คุณจะได้รับข้อผิดพลาด 404 แทน
เฟลิกซ์

อันนี้ใช้ได้จริงอย่างน้อยสำหรับความต้องการของฉัน .. ทดสอบด้วย firefox และยืนยันการทำงาน ปัญหาของฉันคือ URL ต้นทางไม่สอดคล้องกับ HTTPS ในขณะที่เว็บไซต์ของฉันใช้ HTTPS
Fernan Vecina

ทำงานได้เหมือนมีเสน่ห์ในโครเมี่ยมรุ่น 76.0.3809.132 (รุ่นทางการ)
Mohamed Azharuddin

8

คุณจะได้รับคำเตือนเกี่ยวกับเนื้อหาที่ถูกบล็อกในเบราว์เซอร์ส่วนใหญ่เสมอเมื่อพยายามแสดงเนื้อหาที่ไม่ปลอดภัยในหน้า https นี่เป็นเรื่องยากหากคุณต้องการฝังสิ่งต่างๆจากไซต์อื่น ๆ ที่ไม่ได้อยู่หลัง ssl คุณสามารถปิดคำเตือนหรือลบการบล็อกในเบราว์เซอร์ของคุณเอง แต่สำหรับผู้เยี่ยมชมรายอื่นมันเป็นปัญหา

วิธีหนึ่งที่ทำได้คือการโหลดด้านเซิร์ฟเวอร์เนื้อหาและบันทึกภาพและสิ่งอื่น ๆ ไปยังเซิร์ฟเวอร์ของคุณและแสดงภาพเหล่านั้นจาก https

คุณสามารถลองใช้บริการเช่นฝังและรับเนื้อหาผ่านพวกเขา พวกเขามีการสนับสนุนในการรับเนื้อหาที่อยู่เบื้องหลัง https


หากคุณขูดเนื้อหาและแสดงบนไซต์ของคุณความเสี่ยงของการเขียนสคริปต์ข้ามไซต์จะเป็นเสมอ ดังนั้นทางออกของพระเจ้าคือการขูดเนื้อหาใน url แยกต่างหากและนำเสนอข้อมูลใน iframe จาก url นั้นด้วย https ด้วยวิธีดังกล่าวคุณจะป้องกันการเขียนสคริปต์ข้ามไซต์ในการแย่งชิงไซต์และเซสชันของคุณ
Addeladde

6

การใช้ Google เป็นพร็อกซี SSL ไม่ทำงานในขณะนี้

ทำไม?

หากคุณเปิดหน้าใด ๆ จาก google คุณจะพบว่ามีx-frame-optionsฟิลด์ในส่วนหัว ส่วนหัวการตอบสนองของ Google

X-Frame-ตัวเลือกส่วนหัวของการตอบสนอง HTTP สามารถนำมาใช้เพื่อระบุหรือไม่ว่าเบราว์เซอร์ควรได้รับอนุญาตในการแสดงผลหน้าใน<frame>, หรือ<iframe> <object>ไซต์สามารถใช้สิ่งนี้เพื่อหลีกเลี่ยงการโจมตีด้วยการคลิกผ่านโดยตรวจสอบให้แน่ใจว่าเนื้อหาของพวกเขาไม่ได้ถูกฝังลงในเว็บไซต์อื่น

(อ้างอิงจาก MDN)

หนึ่งในวิธีแก้ปัญหา

ด้านล่างคืองานของฉันสำหรับปัญหานี้:

อัปโหลดเนื้อหาไปยัง AWS S3 และจะสร้างลิงค์ https สำหรับทรัพยากร
ประกาศ: ตั้งค่าการอนุญาตเป็นไฟล์ html เพื่อให้ทุกคนดูได้

หลังจากนั้นเราสามารถใช้มันเป็นsrcของ iframe ในเว็บไซต์ https AWS


2

คุณสามารถลองคัดสิ่งที่คุณต้องการด้วย PHP หรือภาษาฝั่งเซิร์ฟเวอร์อื่นจากนั้นใส่ iframe ลงในเนื้อหาที่คัดลอกมา นี่คือตัวอย่างของ PHP:

scrapedcontent.php:

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

index.html:

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

3
คุณจะจัดการรูปภาพอย่างไรรวมไฟล์ JS และ CSS, ไฮเปอร์ลิงก์และคำขอ AJAX
dotancohen

@dotancohen คุณถูกต้องมันไม่ใช่ทางเลือกที่สมบูรณ์แบบ แต่ฉันคิดว่ามันดีที่สุดสำหรับสถานการณ์นี้ บางเว็บไซต์คุณจะไม่พบปัญหาที่คุณกล่าวถึง
อนุญาต

1
วิธีนี้ใช้งานได้ แต่เป็นการโหลดเนื้อหาอย่างมีประสิทธิภาพสองเท่าและดังนั้นเวลาโหลดในขณะที่เซิร์ฟเวอร์ของคุณหายากแล้วให้บริการเนื้อหาอีกครั้ง ...
ChristoKiwi

2

สิ่งที่คุณต้องทำก็แค่ใช้ Google เป็นพร็อกซีเซิร์ฟเวอร์ https://www.google.ie/gwt/x?u=[YourHttpLink]

<iframe src="https://www.google.ie/gwt/x?u=[Your http link]"></frame>

มันใช้งานได้สำหรับฉัน

เครดิต: - https://www.wikihow.com/Use-Google-As-a-Proxy


คุณพยายามใช้งานที่ไหน
Star TechTricks

มันไม่ทำงาน.
EgoPingvina

1

ใช้พร็อกซีย้อนกลับ HTTPS-to-HTTP ของคุณเอง

หากกรณีการใช้งานของคุณมีจำนวนน้อยและแทบจะไม่เปลี่ยน URL ที่จะฝังลงในiframeคุณสามารถตั้งค่า reverse proxy สำหรับเซิร์ฟเวอร์ของคุณเองและกำหนดค่าเพื่อให้httpsURL หนึ่งบนเซิร์ฟเวอร์ของคุณจับคู่กับhttp URL บนเซิร์ฟเวอร์พร็อกซี เนื่องจากพร็อกซีย้อนกลับเป็นแบบเซิร์ฟเวอร์ทั้งหมดเบราว์เซอร์ไม่สามารถค้นพบว่าเป็น "เพียง" พูดคุยกับพร็อกซีของเว็บไซต์จริงและจะไม่บ่นเนื่องจากการเชื่อมต่อกับพร็อกซีใช้ SSL อย่างถูกต้อง

หากตัวอย่างเช่นคุณใช้ Apache2 เป็นเว็บเซิร์ฟเวอร์ของคุณให้ดูคำแนะนำเหล่านี้เพื่อสร้าง reverse proxy


1
mitmproxyเป็นเครื่องมือดีบั๊กไม่ใช่ระบบการผลิตพร็อกซี ngrokเป็นบริการทันเนลส่วนใหญ่สำหรับเซิร์ฟเวอร์การพัฒนาฉันไม่เข้าใจว่ามันจะมีประโยชน์สำหรับเรื่องนี้
kolen

@ kolen มันไม่ได้เกี่ยวกับเครื่องมือ แต่เป็นแนวคิดเกี่ยวกับการใช้ reverse proxy สำหรับสิ่งนี้ แต่ยังไม่ได้กล่าวถึงในคำตอบอื่น ๆ เปลี่ยนเป็น Apache ตอนนี้ซึ่งเป็นวิธีทั่วไปในการทำ reverse proxy
tanius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.