web-dev-qa-db-fra.com

Comment autoriser le contenu http au sein d'une iframe sur un site https

Je charge du code HTML dans un iframe, mais lorsqu'un fichier référencé utilise http, et non pas https, le message d'erreur suivant s'affiche:

[bloqué] La page située à {current_pagename} a exécuté un contenu non sécurisé à partir de {référencé_fichier}

Y a-t-il un moyen de désactiver cela ou un moyen de le contourner?

L'iframe n'a pas d'attribut src et le contenu est défini à l'aide de:

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

En fonction de la généralité de cette question, je pense que vous devrez configurer votre propre proxy HTTPS sur un serveur en ligne. Effectuez les étapes suivantes:

  • Préparez votre serveur proxy - installez IIS, Apache
  • Obtenez un certificat SSL valide pour éviter les erreurs de sécurité (par exemple, exempt de startssl.com)
  • Écrivez un emballage qui téléchargera le contenu non sécurisé (comment faire ci-dessous)
  • À partir de votre site/application, obtenez https://yourproxy.com/?page=http://insecurepage.com

Si vous téléchargez simplement le contenu d'un site distant via file_get_contents ou similaire, vous pouvez toujours avoir des liens non sécurisés vers le contenu. Vous devrez les trouver avec regex et également les remplacer. Les images sont difficiles à résoudre, mais j’ai trouvé une solution de contournement ici: http://foundationphp.com/tutorials/image_proxy.php

25
panpernicek

Remarque: Bien que cette solution ait pu fonctionner dans certains navigateurs lorsqu'elle a été écrite en 2014, elle ne fonctionne plus. La navigation ou la redirection vers une URL HTTP dans une iframe incorporée dans une page HTTPS n'est pas autorisée par les navigateurs modernes, même si le cadre a été créé avec une URL HTTPS.

La meilleure solution que j'ai créée consiste simplement à utiliser Google comme proxy ssl ...

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

Testé et fonctionne sous firefox.

Autres méthodes:

  • Utilisez une tierce partie telle que embed.ly (mais ce n’est vraiment utile que pour les API http bien connues).

  • Créez votre propre script de redirection sur une page https que vous contrôlez (une simple redirection javascript sur une page liée relative devrait faire l'affaire. Quelque chose comme: (vous pouvez utiliser n'importe quelle langue/méthode)

    https://example.com qui a une iframe qui relie à ...

    https://example.com/utilities/redirect.html Qui a un script de redirection js simple comme ...

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

  • Vous pouvez également ajouter un flux RSS ou écrire un lecteur/analyseur pour lire le site http et l'afficher dans votre site https.

  • Vous pouvez/devriez également recommander au propriétaire du site http de créer une connexion SSL. Si pour aucune autre raison que il augmente le référencement .

À moins que le propriétaire du site http ne puisse créer un certificat SSL, la solution la plus sûre et la plus permanente consiste à créer un flux RSS capturant le contenu dont vous avez besoin (sans doute que vous ne faites rien en réalité sur le site http, c’est-à-dire ne vous connectez à aucun système).

Le vrai problème est qu'avoir des éléments http dans un site https représente un problème de sécurité. Il n’existe pas de solution totalement casher au sujet de ce risque de sécurité, les solutions ci-dessus ne sont que des solutions actuelles.

Notez que vous pouvez désactiver cette mesure de sécurité dans la plupart des navigateurs (vous-même, pas pour les autres). Notez également que ces "hacks" peuvent devenir obsolètes avec le temps.

128
Matthew Peters

Je sais que ceci est un ancien post, mais une autre solution consisterait à utiliser cURL, par exemple:

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

puis dans votre tag iframe, quelque chose comme:

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

Ceci est juste un exemple MINIMAL pour illustrer l'idée - cela ne nettoie pas l'URL, cela n'empêcherait pas non plus quelqu'un d'autre d'utiliser le redirect.php à leurs propres fins. Considérez ces choses dans le contexte de votre propre site.

L'avantage, cependant, c'est que c'est plus flexible. Par exemple, vous pouvez ajouter une validation des données $ curl'd pour vous assurer que c’est vraiment ce que vous voulez avant de l’afficher - par exemple, testez pour vous assurer que ce n’est pas une 404, et ayez votre propre contenu alternatif prêt si elle est.

De plus, je suis un peu fatigué de compter sur les redirections Javascript pour tout ce qui est important.

À votre santé!

26
David R.

ajouter <meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests"> dans la tête

référence: http://thehackernews.com/2015/04/disable-mixed-content-warning.html

compatibilité de navigateur: http://caniuse.com/#feat=upgradeinsecurerequests

11
user2523022

Vous obtiendrez toujours des avertissements concernant le contenu bloqué dans la plupart des navigateurs lorsque vous essayez d'afficher du contenu non sécurisé sur une page https. C'est délicat si vous souhaitez intégrer des éléments d'autres sites qui ne sont pas derrière SSL. Vous pouvez désactiver les avertissements ou supprimer le blocage dans votre propre navigateur, mais c'est un problème pour les autres visiteurs.

Une façon de le faire est de charger le serveur de contenu, d'enregistrer les images et d'autres éléments sur votre serveur et de les afficher à partir de https.

Vous pouvez également essayer d’utiliser un service comme embed.ly et d’obtenir le contenu par leur intermédiaire. Ils ont un soutien pour obtenir le contenu derrière https.

7
Addeladde

L'utilisation de Google comme proxy SSL ne fonctionne pas actuellement,

Pourquoi?

Si vous avez ouvert une page de Google, vous constaterez qu’un champ x-frame-options figure dans l’en-tête. Google response header

L'en-tête de réponse HTTP X-Frame-Options peut être utilisé pour indiquer si un navigateur doit ou non autoriser le rendu d'une page dans un fichier <frame>, <iframe> ou <object>. Les sites peuvent l'utiliser pour éviter les attaques de détournement de clic, en veillant à ce que leur contenu ne soit pas intégré à d'autres sites.

(Citation de MDN)

Une de la solution

Ci-dessous mon travail autour de ce problème:

Chargez le contenu sur AWS S3, ce qui créera un lien https pour la ressource.
Remarque: définissez l’autorisation sur le fichier html afin que tout le monde puisse l’afficher.

Après cela, nous pouvons l’utiliser comme src de iframe dans les sites Web https. AWS

5
David Guan

Vous pouvez essayer de supprimer tout ce dont vous avez besoin avec PHP ou un autre langage côté serveur, puis mettez l'iframe dans le contenu supprimé. Voici un exemple avec PHP:

scrapedcontent.php:

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

index.html:

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

S'il s'agit de quelques URL, rarement modifiées, à intégrer dans la iframe, vous pouvez configurer un proxy SSL pour cela sur votre propre serveur et le configurer de sorte qu'une URL https de votre serveur soit mappée sur un http URL sur le serveur mandaté.

Par exemple, je voudrais examiner ngrok et mitmproxy , car ils sont petits et faciles à configurer (bien qu'ils soient généralement destinés à des objectifs légèrement différents).

1
tanius