62 votes

Session perdue lors du passage de HTTP à HTTPS en PHP

Lorsque l'utilisateur envoie une page de paiement, il passe de http://mysite.com à https://mysite.com. En conséquence, les variables $ _SESSION sont perdues.

Le site possède un certificat SSL valide qui peut être utile ou non.

69voto

Jacob Points 581

Lorsque vous basculez entre les HTTP et HTTPS services sur le même serveur, votre HTTP ID de session n'est pas passé à la session HTTPS. Vous pouvez le configurer en passant l'ID de session à partir de l'adresse HTTP de la page à la page HTTPS dans l'une des trois voies possibles:

"session_start() crée une session ou reprend l'actuel basé sur l'id de session en cours qui sont transmises par le biais d'une demande, telles que GET, POST, ou un cookie" de PHP: session_start

Lorsque vous êtes à l'aide de sessions, vous devriez normalement commencer votre script avec "session_start()". Si le navigateur a un cookie de session définie, la fonction session_start() utilisera que l'ID de session. Si le navigateur n'avez pas un cookie de session définie, la fonction session_start() va créer un nouveau.

Si l'ID de session n'est pas définie(dans votre exemple, le navigateur est la création d'un nouveau cookie de session pour la session HTTPS), vous pouvez définir à l'aide de la session_id() fonction. session_id() idéalement retourne l'ID de session en tant que chaîne. Donc

...

$currentSessionID = session_id();

...

définit l' $currentSessionID variable est égale à l'ID de session en cours, et

...

session_id($aSessionID);

...

définit l'id de session cookie dans le navigateur de $aSessionID. à partir de PHP: session_id

Voici un exemple avec deux scripts. L'un est accessible via le protocole HTTP et l'autre est accessible via HTTPS. Ils doivent être sur le même serveur pour maintenir les données de session.

Script 1(HTTP):

<?php

// This script will create a session and display a link to your secure server address
// to transfer your session ID. In this example, the secure page to receive the session
// ID is located at http://www.yoursite.com/safePages/securePage.php

// Start a session using the current session ID stored in a cookie, or create
// a new session if none is set.
session_start();

$currentSessionID = session_id();

// Set a variable that will be retrieved with the HTTPS script.
$_SESSION['testvariable'] = 'It worked';

// $secureServerDomain is the domain of your secure server
$secureServerDomain = 'www.yoursite.com';

// $securePagePath is the path to the page that will receive and set the session ID.
$securePagePath = '/safePages/securePage.php'

echo '<a href="https://' . $secureServerDomain . $securePagePath . '?session="' . $currentSessionID . '">Click here to transfer your session to the secure server</a>';

?>

Script 2(HTTPS):

<?php

// Retrieve the session ID as passed via the GET method.
$currentSessionID = $_GET['session'];

// Set a cookie for the session ID.
session_id($currentSessionID);

// Start a session.
session_start();

// Test retrieval of variable set when using HTTP.
if (!empty($_SESSION['testvariable'])) {
      echo $_SESSION['testvariable'];
} else {
      echo 'It did not work.';
}

?>

Pour que cela fonctionne, les serveurs HTTP et HTTPS doivent utiliser la même session de données de stockage de substrat (c'est à dire pour la valeur par défaut gestionnaire des fichiers, exécuter sur la même machine physique avec le même php.ini). Il y a quelques failles de sécurité ici, je ne voudrais pas utiliser ce code de transfert d'informations sensibles. Il est conçu comme un mécanisme d'exemple.

Quand j'ai rencontré ce problème avant, je suis venu avec le ci-dessus comme une solution rapide, mais je viens de me rappeler à l'origine du problème. J'allais partir http://www.mysite.com/page.php pour https://mysite.com/page.php (remarquez l'absence de "www"). Assurez-vous que http://www.mysite.com/page.php lien vers https://www.mysite.com/page.php et http://mysite.com lien vers https://mysite.com/page.php.

PS, je n'ai pas fait exécuter ces scripts, donc il y a peut être une faute de frappe ou deux qui les empêche de fonctionner correctement.

16voto

JW. Points 17361

Sonne comme le cookie de session est défini pour être sûr. Les Cookies ont une "sécurisé" drapeau qui, si elle est définie à true, ce qui signifie que le cookie ne sera pas envoyés à des sites https. PHP est probablement en utilisant que pour ses cookies de session. Vous pouvez changer cela avec la session_set_cookie_params fonction, ou avec de la session.cookie_secure réglage en php.ini.

12voto

Tom Points 3697

Nous avons eu cette question. Il s'est avéré être parce que nous étions à l'aide de la suhosin patch sur notre installation de PHP. Nous résoudre ce problème en définissant suhosin.session.cryptdocroot = Off en /etc/php.d/suhosin.ini.

Pour le suhosin manuel à propos de suhosin.session.cryptdocroot voir http://www.hardened-php.net/suhosin/configuration.html#suhosin.session.cryptdocroot.

Initialement, nous avions trouvé la solution de ce blog: http://www.yireo.com/blog/general-news/315-switch-between-http-and-https-looses-php-session.

6voto

Mike Purcell Points 12082

La solution suivante suppose l'sécurisé et non sécurisé serveurs ont accès aux mêmes services back-end (cache, magasin de base de données, etc).

Nous avons eu à faire avec ce même problème lors de l'envoi d'un utilisateur de notre caisse de flux lorsqu'ils ont fait les boutiques. Pour résoudre ce problème, nous avons mis en place une couche de mise en cache et cache toutes les données pertinentes. Par exemple, nous permettrait de glaner de l'id de produit et l'id utilisateur de la session de valeurs, de sérialiser, de créer une table de hachage, et enfin stocker les données de session dans le cache en utilisant le hachage de la clé. Nous serions alors rediriger l'utilisateur vers le site sécurisé avec le hash de l'url.

Lorsque l'utilisateur a fini sur le site sécurisé nous de tenter de tirer les données de cache basé sur le hachage. Puis avec l'id utilisateur et id de produit, nous pourrions charger tous les prix et description des données de la base de données et de les présenter à l'utilisateur pour la finale de la caisse d'examen.

Il y a un hériter du risque en ce que le cache de données est volatile, mais nous n'avons jamais eu de problèmes avec elle que la redirection se fait rapidement.

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: