Cách cho phép nội dung http trong iframe trên trang web https


145

Tôi tải một số HTML vào iframe nhưng khi tệp được tham chiếu đang sử dụng http, không phải https, tôi gặp lỗi sau:

[bị chặn] Trang tại {current_pagename} đã chạy nội dung không an toàn từ {Referenceenced_filename}

Có cách nào để tắt cái này hay có cách nào để khắc phục nó không?

Khung nội tuyến không có srcthuộc tính và nội dung được đặt bằng:

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


đã chỉnh sửa. Src không được đặt vì nội dung được ghi vào iframe
georgephillips

1
Cảm ơn tất cả các câu trả lời. Câu chuyện dài là proxy nội dung.
georgephillips

@georgephillips bạn có thể chia sẻ mã để ủy quyền nội dung không?
Gintas_

Câu trả lời:


28

Dựa trên tính tổng quát của câu hỏi này, tôi nghĩ rằng bạn sẽ cần thiết lập proxy HTTPS của riêng mình trên một số máy chủ trực tuyến. Thực hiện các bước sau:

  • Chuẩn bị máy chủ proxy của bạn - cài đặt IIS, Apache
  • Nhận chứng chỉ SSL hợp lệ để tránh các lỗi bảo mật (ví dụ: miễn phí từ startedsl.com)
  • Viết một trình bao bọc, sẽ tải xuống nội dung không an toàn (cách bên dưới)
  • Từ trang web / ứng dụng của bạn, hãy truy cập https://yourproxy.com/?page=http://insecurepage.com

Nếu bạn chỉ cần tải xuống nội dung trang web từ xa thông qua file_get_contents hoặc tương tự, bạn vẫn có thể có các liên kết không an toàn đến nội dung. Bạn sẽ phải tìm chúng với regex và cũng có thể thay thế. Hình ảnh rất khó để giải quyết, nhưng tìm thấy cách giải quyết ở đây: http://foundationphp.com/tutorials/image_proxy.php


1
Điều này sẽ không hoạt động, vì nhiều trang phía sau iframe không muốn được nhúng vào iframe và do đó đặt Tiêu đề tùy chọn khung X thành SAMEORIGIN. Ngay cả khi bạn có thể bỏ qua việc này bằng proxy, trang sẽ cố tải một cái gì đó như /insecurepage.css và trình duyệt của bạn sẽ yêu cầu yourdomain / insecurepage.css
thuốc giải độc

135

Lưu ý: Mặc dù giải pháp này có thể đã hoạt động trong một số trình duyệt khi nó được viết vào năm 2014, nhưng nó không còn hoạt động. Điều hướng hoặc chuyển hướng đến một URL HTTP trong một trang iframeđược nhúng trong trang HTTPS không được các trình duyệt hiện đại cho phép, ngay cả khi khung bắt đầu với URL HTTPS.

Giải pháp tốt nhất tôi tạo ra là chỉ cần sử dụng google làm proxy ssl ...

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

Đã thử nghiệm và hoạt động trong firefox.

Các phương pháp khác:

  • Sử dụng một bên thứ ba, chẳng hạn như embed.ly (nhưng nó thực sự chỉ tốt cho các API http nổi tiếng).

  • Tạo tập lệnh chuyển hướng của riêng bạn trên một trang https mà bạn kiểm soát (một chuyển hướng javascript đơn giản trên một trang được liên kết tương đối sẽ thực hiện thủ thuật. Một cái gì đó như: (bạn có thể sử dụng bất kỳ ngôn ngữ / phương thức nào)

    https://example.com Điều đó có iframe liên kết đến ...

    https://example.com/utilities/redirect.html Trong đó có một kịch bản chuyển hướng js đơn giản như ...

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

  • Ngoài ra, bạn có thể thêm nguồn cấp RSS hoặc viết một số trình đọc / phân tích cú pháp để đọc trang web http và hiển thị nó trong trang web https của bạn.

  • Bạn cũng có thể / nên đề xuất với chủ sở hữu trang web http rằng họ tạo kết nối ssl. Nếu không vì lý do nào khác, nó làm tăng seo .

Trừ khi bạn có thể khiến chủ sở hữu trang web http tạo chứng chỉ ssl, giải pháp an toàn và lâu dài nhất là tạo một nguồn cấp RSS lấy nội dung bạn cần (có lẽ bạn không thực sự 'làm' bất cứ điều gì trên trang web http - đó là nói không đăng nhập vào bất kỳ hệ thống nào).

Vấn đề thực sự là việc có các yếu tố http trong trang web https thể hiện vấn đề bảo mật. Không có cách nào hoàn toàn nghiêm trọng hơn về rủi ro bảo mật này, vì vậy, đây chỉ là những công việc hiện tại xung quanh.

Lưu ý rằng bạn có thể vô hiệu hóa biện pháp bảo mật này trong hầu hết các trình duyệt (chính bạn, không phải cho người khác). Cũng lưu ý rằng những 'hack' này có thể trở nên lỗi thời theo thời gian.


10
Câu trả lời tuyệt vời, cảm ơn. Chỉ cần cho bạn biết trong chrome, phương thức chuyển hướng JS không hoạt động chỉ ngăn chặn sự thay đổi (giống như khi bạn thử tải nó bình thường).
georgephillips

9
Thủ thuật chuyển hướng dường như chỉ hoạt động trong Firefox. Chrome vẫn phủ nhận việc tải nội dung không an toàn. Có cách giải quyết nào khác không?
Andreas Gohr

47
Chỉ muốn báo hiệu rằng phương thức "Tạo tập lệnh chuyển hướng của riêng bạn trên trang https mà bạn kiểm soát" không còn hoạt động với các phiên bản hiện tại của Chrom (e | ium) và Firefox, ngay cả khi sử dụng JS.
kako-nawao

17
Câu trả lời này không hợp lệ cho đến nay, bất kỳ giải pháp nào khác
samdd

22
Câu trả lời nên có một tùy chọn được gắn nhãn là 'không dùng nữa'. Nó tạo ra sự nhầm lẫn trừ khi bạn đọc tất cả các ý kiến.
Nitin

28

Tôi biết đây là một bài viết cũ, nhưng một giải pháp khác sẽ là sử dụng cURL, ví dụ:

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

sau đó trong thẻ iframe của bạn, một cái gì đó như:

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

Đây chỉ là một ví dụ TỐI THIỂU để minh họa ý tưởng - nó không vệ sinh URL, cũng như không ngăn người khác sử dụng redirect.php cho mục đích riêng của họ. Hãy xem xét những điều này trong bối cảnh của trang web của riêng bạn.

Tuy nhiên, ưu điểm là nó linh hoạt hơn. Ví dụ: bạn có thể thêm một số xác thực của dữ liệu $ curl'd để đảm bảo đó thực sự là những gì bạn muốn trước khi hiển thị nó - ví dụ: kiểm tra để đảm bảo đó không phải là 404 và có sẵn nội dung thay thế nếu bạn muốn Là.

Thêm vào đó - Tôi hơi mệt mỏi khi dựa vào chuyển hướng Javascript cho bất cứ điều gì quan trọng.

Chúc mừng!


4
Điều này khá hiệu quả, nhưng các liên kết bên trong trang web đang trở nên không hợp lệ. Ví dụ: tôi có một tên miền được gọi là example.comcó SSL. Tôi đang nhúng iframe example.netkhông có SSL. Các example.comcó một liên kết như href="https://stackoverflow.com/path/file.html"và khi nhấn nó, nó đang mở như https://example.com/path/file.htmlthay vìhttp://example.net/path/file.html
Sibidharan

1
Liên kết không thể tương đối nếu bạn muốn nó hoạt động. Nói cách khác, chỉ định URL đầy đủ trong href. Nếu đây là động, có các thư viện để lấy từng phân đoạn của URL trong Javascript cũng như phía máy chủ.
Anthony Mason

css của trang đích dưới iframe bị hỏng. Vui lòng kiểm tra
Raju yourPepe

14

thêm <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">vào đầu

tham khảo: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

khả năng tương thích của trình duyệt: http://caniuse.com/#feat=upTHERinsecurerequests


23
Giải pháp này không cho phép bạn phân phát nội dung http trên trang web https. Tất cả điều này không bắt buộc các yêu cầu http dưới dạng các yêu cầu https. Nếu tài nguyên không tồn tại trên https, bạn sẽ chỉ gặp lỗi 404.
Felix

Điều này thực sự hoạt động ít nhất là cho nhu cầu của tôi .. đã thử nghiệm nó với firefox và xác nhận hoạt động. Vấn đề của tôi là URL nguồn không tuân thủ HTTPS trong khi trang web của riêng tôi đang sử dụng HTTPS.
Fernan Vecina

Hoạt động như bùa mê trong phiên bản chrome 76.0.3809.132 (Bản dựng chính thức)
Mohamed Azharuddin

8

Bạn sẽ luôn nhận được cảnh báo về nội dung bị chặn trong hầu hết các trình duyệt khi cố gắng hiển thị nội dung không an toàn trên trang https. Điều này thật khó khăn nếu bạn muốn nhúng nội dung từ các trang web khác không đứng sau ssl. Bạn có thể tắt các cảnh báo hoặc xóa chặn trong trình duyệt của riêng bạn nhưng đối với những khách truy cập khác thì đó là một vấn đề.

Một cách để làm điều đó là tải phía máy chủ nội dung và lưu hình ảnh và những thứ khác vào máy chủ của bạn và hiển thị chúng từ https.

Bạn cũng có thể thử sử dụng một dịch vụ như embed.ly và nhận nội dung thông qua chúng. Họ có hỗ trợ để có được nội dung đằng sau https.


nếu bạn cạo nội dung và hiển thị nó trên trang web của bạn thì luôn có nguy cơ kịch bản chéo trang. Vì vậy, một giải pháp tuyệt vời là cạo nội dung trên một url riêng và trình bày dữ liệu trong iframe từ url đó bằng https. Theo cách đó, bạn ngăn chặn kịch bản chéo trang web trên trang web chính và chiếm quyền điều khiển phiên.
Addeladde

6

Sử dụng Google làm proxy SSL hiện không hoạt động,

Tại sao?

Nếu bạn mở bất kỳ trang nào từ google, bạn sẽ thấy có một x-frame-optionstrường trong tiêu đề. Tiêu đề phản hồi của Google

X-Frame-Options tiêu đề HTTP phản ứng có thể được sử dụng để cho biết hay không một trình duyệt nên được cho phép để làm cho một trang trong một <frame>, <iframe>hoặc <object>. Các trang web có thể sử dụng điều này để tránh các cuộc tấn công nhấp chuột, bằng cách đảm bảo rằng nội dung của chúng không được nhúng vào các trang web khác.

(Trích dẫn từ MDN)

Một trong những giải pháp

Dưới đây là công việc của tôi cho vấn đề này:

Tải nội dung lên AWS S3 và nó sẽ tạo liên kết https cho tài nguyên.
Lưu ý: đặt quyền cho tệp html để cho phép mọi người xem nó.

Sau đó, chúng tôi có thể sử dụng nó làm srciframe trong các trang web https. AWS


2

Bạn có thể thử cạo bất cứ thứ gì bạn cần với PHP hoặc ngôn ngữ phía máy chủ khác, sau đó đặt iframe vào nội dung bị loại bỏ. Đây là một ví dụ với PHP:

scrapedcontent.php:

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

index.html:

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

3
Làm thế nào bạn sẽ xử lý hình ảnh, bao gồm các tệp JS và CSS, siêu liên kết và các yêu cầu AJAX?
dotancohen

@dotancohen bạn nói đúng, đó không phải là một giải pháp hoàn hảo, nhưng tôi nghĩ đó là cách tốt nhất cho tình huống này. Một số trang web bạn sẽ không gặp phải vấn đề bạn đã thảo luận.
Cấp

1
Điều này hoạt động, nhưng nó có hiệu quả gấp đôi tải nội dung và do đó tải thời gian khi máy chủ của bạn loại bỏ và sau đó phục vụ lại nội dung ...
ChristoKiwi


1

Sử dụng proxy ngược HTTPS-to-HTTP của riêng bạn.

Nếu trường hợp sử dụng của bạn là khoảng một vài, hiếm khi thay đổi URL để nhúng vào iframe, bạn chỉ cần thiết lập một proxy ngược cho điều này trên máy chủ của riêng bạn và định cấu hình nó để một httpsURL trên máy chủ của bạn ánh xạ tới một httpURL trên máy chủ được ủy quyền. Vì proxy ngược hoàn toàn nằm ở phía máy chủ, trình duyệt không thể phát hiện ra rằng nó "chỉ" nói chuyện với proxy của trang web thực và do đó sẽ không khiếu nại vì kết nối với proxy sử dụng SSL đúng cách.

Ví dụ: nếu bạn sử dụng Apache2 làm máy chủ web của mình, thì hãy xem các hướng dẫn sau để tạo proxy ngược.


1
mitmproxylà một công cụ gỡ lỗi, không phải hệ thống ủy quyền sản xuất. ngroklà dịch vụ đường hầm, chủ yếu dành cho các máy chủ phát triển, tôi không hiểu làm thế nào nó có thể hữu ích cho việc này.
đánh cắp

@kolen Không phải là về các công cụ, đó là về ý tưởng sử dụng proxy ngược cho việc này, chưa được đề cập trong các câu trả lời khác. Thay đổi thành Apache bây giờ, đây là cách phổ biến hơn nhiều để thực hiện proxy ngược.
tanius
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.