96 votes

Traitement du contenu HTTP dans les pages HTTPS

Nous avons un site qui est entièrement accessible via HTTPS, mais parfois l'affichage de contenu externe qui est HTTP (images à partir de flux RSS, principalement). La grande majorité de nos utilisateurs sont également collé sur IE6.

J'ai l'idéal serait de faire les deux opérations suivantes

  • Prévenir l'IE message d'avertissement sur un contenu non sécurisé (afin que je puisse montrer moins sévère, par exemple en remplaçant les images par défaut avec une icône comme ci-dessous)
  • Présenter quelque chose d'utile pour les utilisateurs à la place des images qu'ils ne peuvent pas voir autrement; si il y avait une certaine JS j'ai pu courir à comprendre que les images n'ont pas été chargés et de les remplacer par une image de la nôtre au lieu de cela, ce serait super.

J'imagine que le but premier n'est tout simplement pas possible, mais le second peut être suffisant.

Un scénario du pire est que j'ai analyser le flux RSS lorsque nous importer, de saisir les images, de les stocker localement afin que les utilisateurs puissent y accéder de cette façon, mais il semble comme beaucoup de douleur pour raisonnablement peu de gain.

155voto

Sripathi Krishnan Points 15402

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

Vous êtes déjà l'analyse du flux RSS, vous avez déjà l'image d'Url. Disons que vous avez un URL de l'image comme http://otherdomain.com/someimage.jpg. Vous réécrivez cette URL https://mydomain.com/imageserver?url=http://otherdomain.com/someimage.jpg&hash=abcdeafad. De cette façon, le navigateur fait une requête https, afin que vous vous débarrasser de ces problèmes.

La prochaine partie - créer une page proxy ou servlet qui effectue les opérations suivantes -

  1. Lire le paramètre de l'url de la chaîne de requête, et de vérifier le hash
  2. Télécharger l'image depuis le serveur, proxy et de revenir au navigateur
  3. En option, les images en cache 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 ne voulez que votre servlet pour servir des images pour les url que vous avez construit. Ainsi, lorsque vous créez l'url, de calculer, md5(image_url + secret_key) et d'ajouter que le paramètre de hachage. Avant de vous servir de la demande, de recalculer la valeur de hachage et de le comparer à ce qui a été transmis à vous. 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 capable de port le code ci-dessous sur un autre back-end de la technologie.

/*
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);
    }    
}

3voto

Raine Points 2163

Je ne sais pas si cela conviendrait à ce que vous faites, mais comme solution rapide, je voudrais "envelopper" le contenu http dans un script https. Par exemple, sur votre page qui est servie via https, je voudrais introduire un iframe qui remplacerait votre flux rss. Dans le src attr de l'iframe, mettez sur votre serveur l'URL d'un script qui capture le flux et génère le code HTML. le script lit le flux via http et le renvoie via https (donc "wrapping")

Juste une pensée

2voto

UpTheCreek Points 7719

En ce qui concerne votre deuxième exigence - vous pourrez peut-être utiliser l’événement onerror, c.-à-d. <img onerror="some javascript;"...

Mettre à jour:

Vous pouvez également essayer d'itérer à travers document.images dans le domaine. Vous pouvez utiliser une propriété booléenne complete . Je ne sais pas avec certitude si cela conviendra, mais cela vaut peut-être la peine d’enquêter.

0voto

Daniel Points 909

Il serait préférable d’avoir le contenu http sur https

-1voto

TomTom Points 35574

Tout simplement: NE PAS le FAIRE. L'adresse Http du Contenu dans une page HTTPS est par nature précaire. Point. C'est pourquoi IE affiche un avertissement. Se débarrasser de l'avertissement est une bête de la foutaise approche.

Au lieu de cela, une page HTTPS devrait seulement avoir le contenu HTTPS. Assurez-vous que le contenu peut être chargé via HTTPS, trop, et le référencer via https si la page est chargée via le protocole https. Pour du contenu externe, cela signifie le chargement et la mise en cache des éléments localement, de sorte qu'ils sont disponibles via https - sûr. Pas moyen de contourner cela, malheureusement.

L'avertissement est là pour une bonne raison. Sérieusement. Passez 5 minutes à penser comment vous pourrait prendre plus d'un https page avec du contenu personnalisé, vous serez surpris.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X