web-dev-qa-db-fra.com

Servir des images HTTP sur un site HTTPS. Puis-je ajouter un "domaine sécurisé"?

Je sais que par le titre, cela a peut-être été demandé à plusieurs reprises, mais je n'ai pas vraiment trouvé de situation similaire (bien, une) et je me suis demandé s'il pourrait y avoir une approche différente?

J'ai un tableau de bord compatible SSL (https), mais j'ai le besoin d'afficher des images d'un autre de mes propres sites, liées au tableau de bord, mais hébergées sous un autre domaine et un autre serveur, qui n'est pas encore compatible SSL. (http).

Je pense à deux solutions possibles en plus de la solution évidente consistant à "activer l’authentification SSL du site de l’autre site" (sur laquelle je travaille, mais qui est complexe).

Ma première pensée est la suivante: puis-je "autoriser" certains domaines au niveau du serveur, quelque part dans mon serveur https, pour "autoriser" le trafic non https d'un domaine particulier considéré comme sûr? Ou est-ce plus une chose de navigateur qui ne permettra pas que cela se produise?

Si ce n'est pas possible, y a-t-il moyen de "récupérer" l'image en arrière-plan (lors du chargement de la page) du site http vers le site https afin de l'afficher? J'ai lu sur les procurations et sur la façon dont cela pourrait être fait, mais je ne suis pas sûr que ce soit la bonne approche. Mon langage de programmation est PHP. Je me demande si je pourrais faire un 'fichier_get_contents' sur l'image, mais je devrais alors m'inquiéter de savoir comment/où il est stocké provisoirement. Cela pourrait-il être en mémoire d'une manière ou d'une autre, ou comment pourrais-je le stocker temporairement "par utilisateur"?

Juste pour être clair, ce sont des images de mes propres sites VERS mes propres sites. Je n'essaie pas de faire quelque chose de bizarre ou de mal (à part de ne pas encore avoir le 2ème site SSL activé, ce qui est bien sûr la solution correcte). J'ai vu beaucoup de gens demander comment obtenir des images d'autres sites/serveurs non possédés, alors que j'ai le contrôle sur ces deux sites, car ce sont mes propres sites.

2
omega1

De manière réaliste, vos options sont vraiment les suivantes:

(a) Obtenez la configuration du deuxième site Web avec SSL comme vous l’avez déjà mentionné. C'est probablement la meilleure solution à long terme.

(b) Utilisez un script proxy sur votre site Web compatible SSL pour diffuser les images provenant de l'autre serveur. Cette méthode augmentera votre utilisation globale de la bande passante et forcera votre serveur exécutant le site Web sécurisé à travailler plus fort, mais en réalité, cela pourrait très bien fonctionner pour vous en tant que solution à court et à moyen terme. J'ai déjà utilisé cette méthode à quelques reprises et elle peut être très efficace à certaines fins.

Un exemple de script PHP hébergé sur votre site Web utilisant SSL pour obtenir ceci pourrait ressembler à ceci:

<?php
const PROXY_DOMAIN = 'http://www.example-without-ssl.com/';

class AssetProxy {
  private $aHeaders;
  private $sData;

  public function __construct($sURL) {
    $this->aHeaders = array();
    $this->sData = '';

    /* HTTP 404 if resource does not exist */      
    if ($this->RemoteFileExists($sURL) == false) {
      header('HTTP/1.0 404 Not Found');
      exit;      
    }

    /* HTTP 304 if resource same as held in browser cache */
    $sData = @file_get_contents($sURL);
    $sETag = md5($sData);
    $this->aHeaders[] = sprintf('ETag: %s', $sETag);
    $sSuppliedETag = isset($_SERVER['HTTP_IF_NONE_MATCH']) ?
      $_SERVER['HTTP_IF_NONE_MATCH'] : '';
    if ($sSuppliedETag == $sETag) {
      header('HTTP/1.1 304 Not Modified');
      header('Content-Length: 0');
      exit;
    }

    /* Send asset with gzip compression */
    $this->DetectFileType($sURL);
    $this->SetBrowserCache(60 * 60 * 24 * 35); // 35 days
    if (!ob_start('ob_gzhandler')) ob_start();
    foreach ($this->aHeaders as $sHeader) header($sHeader);
    echo($sData);
  }

  private function RemoteFileExists($sURL) {
    $hCURL = curl_init($sURL);
    curl_setopt($hCURL, CURLOPT_NOBODY, true);
    $bResult = curl_exec($hCURL);
    if (!$bResult) return false;
    $iStatus = (int)curl_getinfo($hCURL, CURLINFO_HTTP_CODE);
    return ($iStatus == 200);
  }

  private function DetectFileType($sURL) {
    $sFileExtension = strtolower(substr($sURL, 1 + strripos($sURL, '.')));
    switch ($sFileExtension) {
      case 'js': $sMimeType = 'text/javascript'; break;
      case 'css': $sMimeType = 'text/css'; break;
      case 'swf': $sMimeType = 'application/x-shockwave-flash'; break;
      case 'png': $sMimeType = 'image/png'; break;
      case 'jpg': $sMimeType = 'image/jpeg'; break;
      case 'eot': $sMimeType = 'application/vnd.ms-fontobject'; break;
      default: $sMimeType = 'text/plain'; break;
    }
    $this->aHeaders[] = 'Content-Type: ' . $sMimeType . '; charset: UTF-8';
  }

  private function SetBrowserCache($iSeconds) {
    $dtNow = time();
    $dtExpires = strtotime(sprintf('+%s seconds', $iSeconds));
    $this->aHeaders[] = 'Expires: ' . date('r', $dtExpires);
    $this->aHeaders[] = 'Last-Modified: ' . date('r', $dtNow);
    $this->aHeaders[] = 'Cache-Control: public, must-revalidate, ' . 
      sprintf(max-age=%s', $iSeconds);
  }

}

$sAsset = isset($_GET['asset']) ? $_GET['asset'] : '';
$oProxy = new AssetProxy(PROXY_DOMAIN . $sAsset);
exit;

J'aime appeler ce script gzip.php plutôt que tout ce qui donne son script de proxy. Ensuite, dans votre code HTML, modifiez toutes les occurrences d’URL:

http://www.example-without-ssl.com/images/example.jpg

avec les nouvelles URL telles que

https://www.example-with-ssl.com/gzip.php?asset=images/example.jpg

J'ai conservé ce type de fichier script agnostique afin qu'il puisse servir à différents types de ressources statiques, notamment les javascripts, les feuilles de style, les polices ainsi que les images. Pour ajouter plus de types de fichiers, ajoutez simplement les types MIME à la fonction DetectFileType () sinon ils seront servis avec un type MIME text/plain par défaut.

2
richhallstoke