2009-02-16 8 views
4

Donc genre de très similaire à « Detecting https requests in php »:HTTPS vs HTTP Détection sur le serveur renvoyant rien d'utile

Vous voulez avoir https://example.com/pog.php aller à http://example.com/pog.php ou même vice-versa.

Problèmes:

  • Impossible de lire quoi que ce soit de $ _SERVER [ « HTTPS »] car il est pas là
  • serveur envoie les requêtes sur le port 80, ne peut donc pas vérifier sur le 443 HTTPS Version
  • apache_request_headers() et apache_response_headers() sont renvoit la même chose
  • ne peut pas dire quoi que ce soit loadbalancer ou faire envoyer somethings supplémentaires
  • données de rétroaction Server recraché par la page sur les deux appels d'URL est exactement la même sauvegarde pour l'ID de session. Bummer.

Existe-t-il des moyens sur la page pour détecter si elle est appelée via SSL ou non SSL?

Modifier: $_SERVER["HTTPS"] n'est pas là, allumé ou pas, peu importe si vous regardez le site via SSL ou non-SSL. Pour une raison quelconque, l'hébergement a choisi de servir toutes les requêtes HTTPS cryptées, mais en bas du port 80. Et donc, le $_SERVER["HTTPS"] n'est jamais allumé, pas là, juste pas de retour utile sur ce point serveur. Donc ce paramètre est toujours vide.

(Et oui, cela signifie qu'il se trouve en position de dire FF ou Chrome pour un certificat SSL partiellement invalide. Mais cette partie n'a pas d'importance.)

En outre, le plus qui peut être obtenu à partir de détecter l'URL est jusqu'au point des barres obliques. Le PHP ne peut pas voir si la requête a https ou http à l'avant.

Répondre

22

Mot-clé - Load Balancer

Le problème se résume au fait que l'équilibrage de charge gère le chiffrement/déchiffrement SSL et il est complètement transparent pour le serveur Web.

Request: Client -> 443or80 -> loadbalancer -> 80 -> php 
Response: PHP -> 80 -> loadbalancer -> 443or80 -> Client 

La vraie question ici est « avez-vous le contrôle de la configuration de équilibreur de charge? »


Si vous le faites, il y a deux manières de le manipuler. Configurez l'équilibreur de charge pour qu'il ait des définitions de service séparées pour HTTP et HTTPS. Ensuite, envoyez le trafic HTTP vers le port 80 des serveurs Web et le trafic HTTPS vers le port 81 des serveurs Web. (le port 81 n'est utilisé par rien d'autre).

Dans apache, configurer deux hôtes virtuels:

<VirtualHost 1.2.3.4:80> 
    ServerName foo.com 
    SetEnv USING_HTTPS 0 
    ... 
</VirtualHost> 

<VirtualHost 1.2.3.4:81> 
    ServerName foo.com 
    SetEnv USING_HTTPS 1 
    ... 
</VirtualHost> 

Ensuite, la variable d'environnement USING_HTTPS sera soit 1 | 0, en fonction de l'hôte virtuel détecté. Cela sera disponible dans le tableau $_SERVER en PHP. N'est-ce pas cool?


Si vous n'avez pas accès à la configuration Load Balancer, alors les choses sont un peu plus compliqué. Il n'y aura pas moyen de savoir avec certitude si vous utilisez HTTP ou HTTPS, car HTTP et HTTPS sont protocoles. Ils spécifient comment se connecter et dans quel format envoyer les informations, mais dans les deux cas, vous utilisez HTTP 1.1 pour effectuer la demande. Il n'y a aucune information dans la demande actuelle pour dire si c'est HTTP ou HTTPS.

Mais ne perdez pas courage. Il y a quelques idées.

Le sixième paramètre de la fonction setcookie() de PHP peut indiquer à un client d'envoyer le cookie UNIQUEMENT via des connexions HTTPS (http://www.php.net/setcookie). Peut-être pourriez-vous définir un cookie avec ce paramètre et ensuite vérifier pour les demandes suivantes?

Une autre possibilité serait d'utiliser JavaScript pour mettre à jour les liens sur chaque page en fonction du protocole (en ajoutant un paramètre GET).

(aucun des ci-dessus serait l'épreuve des balles)

Une autre option pragmatique serait d'obtenir votre SSL sur un domaine différent, comme secure.foo.com. Ensuite, vous pouvez recourir à l'astuce VirtualHost ci-dessus.


je sais que ce n'est pas le plus facile problème parce que je traite pendant la journée (charge de cluster Web équilibrée derrière un équilibreur de charge Cisco CSS avec le module SSL). Enfin, vous pouvez toujours considérer que votre application Web doit passer en mode SSL si nécessaire, et faire confiance aux utilisateurs de ne PAS le reculer (après tout, ce sont leurs données sur la ligne (généralement)).

J'espère que ça aide un peu.

+1

Ne faites jamais confiance à l'utilisateur. La page doit rester sur la version HTTP, donc si jamais ils essayent d'aller à HTTPS, ils sont renvoyés à la version HTTP. J'ai aimé votre réponse si. – random

4
$ _SERVER ["HTTPS"] n'est pas là, activé ou non, que vous regardiez le site via SSL ou non SSL. Pour une raison quelconque, l'hébergement a choisi de servir toutes les requêtes HTTPS cryptées, mais sur le port 80. Et donc, le $ _SERVER ["HTTPS"] n'est jamais allumé, pas là, juste pas de retour utile sur ce point serveur. Donc ce paramètre est toujours vide.

Vous devez vous assurer que le fournisseur a la ligne suivante dans l'entrée VHOST pour votre site: SSLOptions +StdEnvVars. Cette ligne indique à Apache d'inclure les variables SSL dans l'environnement pour vos scripts (PHP).

Questions connexes