Traitement du contenu HTTP dans les pages HTTPS

nous avons un site auquel on accède entièrement via HTTPS, mais qui affiche parfois contenu externe qui est HTTP (images de flux RSS, principalement). La grande majorité de nos utilisateurs sont également bloqués sur IE6.

j'aimerais idéalement faire les deux suivantes

  • empêcher le message D'avertissement IE sur le contenu non sécurisé (de sorte que je puisse en afficher un moins intrusif, par exemple en remplaçant les images par une icône par défaut comme ci-dessous)
  • présente quelque chose d'utile aux utilisateurs à la place des images qu'ils ne peuvent pas voir autrement; s'il y avait quelques JS je pourrais courir pour comprendre quelles images n'ont pas été chargées et les remplacer par une image de la nôtre à la place qui serait grande.

je soupçonne que le premier objectif n'est tout simplement pas possible, mais le second peut être suffisant.

un des pires scénarios est que je parse les flux RSS quand nous les importons, prenez les images les stocker localement afin que les utilisateurs peuvent y accéder de cette façon, mais il semble que beaucoup de peine pour un gain raisonnablement peu.

83
demandé sur El Yobo 2010-06-10 06:17:57

10 réponses

Votre pire scénario n'est pas aussi mauvais que vous le pensez.

vous analysez déjà le flux RSS, donc vous avez déjà les URLs de l'image. Dites que vous avez une URL d'image comme http://otherdomain.com/someimage.jpg . Vous réécrivez cette URL comme https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad . De cette façon, le navigateur fait toujours la demande sur https, donc vous vous débarrassez des problèmes.

la partie suivante-créer une page ou un servlet de procuration qui fait ce qui suit -

  1. Lire l'url paramètre de la chaîne de requête, et vérifier le hachage
  2. télécharger l'image à partir du serveur, et le renvoyer par procuration au navigateur
  3. optionnellement, cache l'image sur le disque

Cette solution présente certains avantages. Vous n'avez pas à télécharger l'image au moment de la création de l'html. Vous n'avez pas à stocker les images localement. Aussi, vous êtes apatride; l'url contient toutes les informations nécessaires pour servir de l'image.

enfin, le paramètre de hachage est pour la sécurité; vous voulez seulement que votre servlet serve des images pour les urls que vous avez construites. Ainsi, lorsque vous créez l'url, calculez md5(image_url + secret_key) et ajoutez-le comme paramètre de hachage. Avant de servir la demande, recalculez le hachage et comparez-le à ce qui vous a été transmis. Depuis le secret_key n'est connue que de vous, personne d'autre ne peut construire des url valides.

Si vous développez en java, Servlet est juste quelques lignes de code. Vous devriez être en mesure de porter le code ci-dessous sur toute autre technologie d'arrière-plan.

/*
targetURL is the url you get from RSS feeds
request and response are wrt to the browser
Assumes you have commons-io in your classpath
*/

protected void proxyResponse (String targetURL, HttpServletRequest request,
 HttpServletResponse response) throws IOException {
    GetMethod get = new GetMethod(targetURL);
    get.setFollowRedirects(true);    
    /*
     * Proxy the request headers from the browser to the target server
     */
    Enumeration headers = request.getHeaderNames();
    while(headers!=null && headers.hasMoreElements())
    {
        String headerName = (String)headers.nextElement();

        String headerValue = request.getHeader(headerName);

        if(headerValue != null)
        {
            get.addRequestHeader(headerName, headerValue);
        }            
    }        

    /*Make a request to the target server*/
    m_httpClient.executeMethod(get);
    /*
     * Set the status code
     */
    response.setStatus(get.getStatusCode());

    /*
     * proxy the response headers to the browser
     */
    Header responseHeaders[] = get.getResponseHeaders();
    for(int i=0; i<responseHeaders.length; i++)
    {
        String headerName = responseHeaders[i].getName();
        String headerValue = responseHeaders[i].getValue();

        if(headerValue != null)
        {
            response.addHeader(headerName, headerValue);
        }
    }

    /*
     * Proxy the response body to the browser
     */
    InputStream in = get.getResponseBodyAsStream();
    OutputStream out = response.getOutputStream();

    /*
     * If the server sends a 204 not-modified response, the InputStream will be null.
     */
    if (in !=null) {
        IOUtils.copy(in, out);
    }    
}
141
répondu Sripathi Krishnan 2010-06-15 05:38:09

si vous cherchez une solution rapide pour charger des images sur HTTPS, alors le service de proxy inverse gratuit à https://images.weserv.nl / may interest you. C'était exactement ce que je cherchais.

si vous cherchez une solution payante, j'ai déjà utilisé Cloudinary.com ce qui fonctionne aussi bien mais est trop cher uniquement pour cette tâche, à mon avis.

9
répondu nullable 2017-06-04 02:49:41

Je ne sais pas si cela correspond à ce que vous faites, mais comme solution rapide, je" envelopperai " le contenu http dans un script https. Par exemple, sur votre page qui est servie par https, Je présenterais une iframe qui remplacerait votre flux rss et dans l'attr src de l'iframe mettre une url d'un script sur votre serveur qui capture le flux et les sorties html. le script lit le flux par http et le sort par https (donc "wrapping")

juste un pensée

3
répondu Raine 2010-06-14 07:14:40

Concernant votre deuxième exigence, vous pourriez être en mesure d'utiliser l'événement onerror, c'est à dire. <img onerror="some javascript;"...

mise à jour:

vous pouvez également essayer itérer par document.images dans le dom. Il existe une propriété booléenne complete que vous pourriez utiliser. Je ne suis pas sûr que ce soit approprié, mais cela pourrait valoir la peine d'enquêter.

2
répondu UpTheCreek 2010-06-14 10:09:11

il serait préférable d'avoir le contenu http sur https

0
répondu Daniel 2010-06-14 11:58:30

parfois, comme dans les applications facebook, nous ne pouvons pas avoir de contenu non sécurisé dans une page sécurisée. nous ne pouvons pas faire de ces contenus. par exemple, une application qui va se charger dans iFrame n'est pas un contenu simple et nous ne pouvons pas le rendre local.

je pense que nous ne devrions jamais charger le contenu http dans https, nous ne devrions pas non plus faire basculer la page https vers la version http pour empêcher la boîte de dialogue erreur.

la seule façon d'assurer la sécurité de l'utilisateur est d'utiliser la version https de tout contenu, http://developers.facebook.com/blog/post/499 /

0
répondu Mohammad Ali Akbari 2012-05-03 17:18:28

la réponse acceptée m'a aidé à mettre à jour cela à la fois à PHP ainsi que CORS, donc j'ai pensé que je voudrais inclure la solution pour les autres:

pur PHP / HTML:

<?php // (the originating page, where you want to show the image)
// set your image location in whatever manner you need
$imageLocation = "http://example.com/exampleImage.png";

// set the location of your 'imageserve' program
$imageserveLocation = "https://example.com/imageserve.php";

// we'll look at the imageLocation and if it is already https, don't do anything, but if it is http, then run it through imageserve.php
$imageURL = (strstr("https://",$imageLocation)?"": $imageserveLocation . "?image=") . $imageLocation;

?>
<!-- this is the HTML image -->
<img src="<?php echo $imageURL ?>" />

javascript / jQuery:

<img id="theImage" src="" />
<script>
    var imageLocation = "http://example.com/exampleImage.png";
    var imageserveLocation = "https://example.com/imageserve.php";
    var imageURL = ((imageLocation.indexOf("https://") !== -1) ? "" : imageserveLocation + "?image=") + imageLocation;
    // I'm using jQuery, but you can use just javascript...        
    $("#theImage").prop('src',imageURL);
</script>

imageserve.php voir /q/scro-avec-php-headers-23234/"https://example.com"; // ici, vous pouvez définir quels types d'images vous accepterez $supported_images = array ('png', 'jpeg', 'jpg', 'gif', 'ico'); // ce est un CORS ultra-minimal - l'envoi de données de confiance à vous-même en-tête ("Access-Control - Allow-Origin: $ mySecureSite"); $pièces = pathinfo($_GET['image']); $extension = $parties['extension']; si(in_array ($extension,$supported_images)) { en-tête ("Content-Type: image/ $ extension"); $image = file_get_contents($_GET ['image']); echo $ image; }

0
répondu CFP Support 2018-04-02 10:33:53

simplement: ne le faites pas. Le contenu Http d'une page HTTPS est intrinsèquement peu sûr. Point. C'est pourquoi IE montre un avertissement. Se débarrasser de l'avertissement est une approche stupide.

au lieu de cela, une page HTTPS devrait seulement avoir un contenu HTTPS. Assurez-vous que le contenu peut aussi être chargé via HTTPS, et référencez-le via https si la page est chargée via https. Pour le contenu externe, cela signifie charger et mettre en cache les éléments localement afin qu'ils sont disponibles via https - sûr. Pas moyen de contourner ça, malheureusement.

L'avertissement est là pour une bonne raison. Sérieusement. Passez 5 minutes à penser comment vous pourriez prendre en charge une page affichée sur https avec du contenu personnalisé - vous serez surpris.

-2
répondu TomTom 2010-06-14 06:35:27

la Meilleure façon de travailler pour moi

<img src="/path/image.png" />// this work only online
    or
    <img src="../../path/image.png" /> // this work both
    or asign variable
    <?php 
    $base_url = '';
    if($_SERVER['HTTP_HOST'] == 'localhost')
    {
         $base_url = 'localpath'; 
    }
    ?>
    <img src="<?php echo $base_url;?>/path/image.png" /> 
-2
répondu sandeep kumar 2017-07-21 12:07:57

je me rends compte que c'est un vieux thread mais une option est juste de supprimer le http: part de l'URL de l'image de sorte que ' http://some/image.jpg ' devient '//certains/image.jpg". Cela fonctionnera également avec CDNs

-3
répondu Shmarkus 2016-01-12 20:12:52