En envoyant l'utilisateur vers une page de paiement, il passe de http://sitename.com
a https://sitename.com
.
En conséquence, $_SESSION
les variables sont perdues.
Le site dispose d'un certificat SSL valide qui peut ou non être utile.
En envoyant l'utilisateur vers une page de paiement, il passe de http://sitename.com
a https://sitename.com
.
En conséquence, $_SESSION
les variables sont perdues.
Le site dispose d'un certificat SSL valide qui peut ou non être utile.
Lorsque vous passez du service HTTP au service HTTPS sur le même serveur, votre ID de session HTTP n'est pas transmis à la session HTTPS. Vous pouvez le définir en transmettant l'ID de session de la page HTTP à la page HTTPS de l'une des trois manières possibles :
De PHP : session_start :
session_start()
crée une session ou reprend la session actuelle en se basant sur en fonction de l'identifiant de session actuel transmis par une requête, telle que GET, POST, ou un cookie
Lorsque vous utilisez des sessions, vous démarrez normalement votre script avec session_start()
. Si le navigateur dispose d'un cookie d'identification de session, session_start()
utilisera cet identifiant de session. Si le navigateur ne dispose pas d'un cookie d'identification de session, session_start()
en créera un nouveau.
Si l'ID de session n'est pas défini (dans votre exemple, le navigateur crée un nouveau cookie d'ID de session pour la session HTTPS), vous pouvez le définir à l'aide de la commande session_id()
fonction. session_id()
renvoie également l'ID de la session sous forme de chaîne. Ainsi,
...
$currentSessionID = session_id();
...
définit le $currentSessionID
égale à l'ID de la session en cours, et
...
session_id($aSessionID);
...
fixe le cookie sessionID dans le navigateur à $aSessionID
. de PHP : session_id
Voici un exemple avec deux scripts. L'un est accessible via HTTP et l'autre 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 le même substrat de stockage des données de session (c'est-à-dire, pour le gestionnaire de fichiers par défaut, fonctionner sur la même machine physique avec le même php.ini). Il y a quelques failles de sécurité ici, donc je n'utiliserais pas ce code pour transférer des informations sensibles. Il s'agit simplement d'un exemple pratique.
Lorsque j'ai rencontré ce problème auparavant, j'ai proposé la solution ci-dessus comme solution rapide, mais je me suis souvenu de la cause initiale du problème. Je passais de http://www.example.com/page.php a https://example.com/page.php (remarquez l'absence de "www"). Assurez-vous que http://www.example.com/page.php sera lié à https://www.example.com/page.php y http://example.com sera lié à https://example.com/page.php .
PS, je n'ai pas réellement exécuté ces scripts, il peut donc y avoir une ou deux fautes de frappe qui les empêchent de fonctionner correctement tels quels.
Je ne vois pas la nature des problèmes de sécurité ici - connaissez-vous des ressources qui les décrivent ?
Question de sécurité : quelqu'un pourrait continuellement visiter votre site et deviner les variables session_id, pour finalement détourner la session d'une autre personne. Je ne vois pas comment un hachage salé pourrait fonctionner, car il s'agit d'une opération à sens unique ; vous hacherez un mot de passe et ferez de même pour une tentative de mot de passe, mais dans ce cas, cela ne fonctionnerait pas vraiment ; vous avez besoin de la valeur originale.
On dirait que le cookie de session est configuré pour être sécurisé. Les cookies ont un "sécurisé" qui, s'il est défini à true, signifie que le cookie ne sera pas envoyé aux sites non-https. PHP l'utilise probablement pour ses cookies de session. Vous pouvez changer cela avec l'option session_set_cookie_params ou avec la fonction session.cookie_secure dans le php.ini.
L'OP a spécifié que le cookie a été perdu lors du transfert. à une connexion cryptée. Le site sécurisé ne s'applique pas ici.
@Unsigned - Si vous passez à une page sécurisée et que vous demandez à la page d'utiliser uniquement des cookies de session sécurisés, elle doit créer un nouveau cookie sécurisé et ne peut pas utiliser le cookie non sécurisé existant.
@martinstoeckli - C'est vrai. Cependant, le paramètre par défaut est off
. Si c'était on
les cookies n'auraient pas été envoyés à la page HTTP, ce qui signifie que le cookie n'aurait jamais dû exister là non plus. Par conséquent, le cookie n'est pas sécurisé.
Nous avons également eu ce problème. Il s'est avéré que c'était dû au fait que nous utilisions l'option suhosin sur notre installation de PHP. Nous le corrigeons en mettant suhosin.session.cryptdocroot = Off
en /etc/php.d/suhosin.ini
.
Pour le manuel suhosin sur suhosin.session.cryptdocroot
voir http://www.hardened-php.net/suhosin/configuration.html#suhosin.session.cryptdocroot .
Nous avons trouvé le correctif dans cet article de blog : http://www.yireo.com/blog/general-news/315-switch-between-http-and-https-looses-php-session .
La solution suivante suppose que les serveurs sécurisés et non sécurisés ont accès aux mêmes services dorsaux (cache, magasin de base de données, etc.).
Nous avons dû faire face à ce même problème lorsque nous avons envoyé un utilisateur vers notre flux de paiement lorsqu'il avait terminé ses achats. Pour résoudre ce problème, nous avons mis en place une couche de mise en cache et mis en cache toutes les données pertinentes. Par exemple, nous glanons les identifiants du produit et de l'utilisateur à partir des valeurs de session, nous les sérialisons, nous créons un hachage et nous stockons enfin les données de session dans le cache en utilisant le hachage comme clé. Nous redirigerions ensuite l'utilisateur vers le site sécurisé avec le hash dans l'url.
Lorsque l'utilisateur arrive sur le site sécurisé, nous essayons d'extraire les données du cache en fonction du hachage. Ensuite, avec l'identifiant de l'utilisateur et les identifiants des produits, nous pouvons charger toutes les données de prix et de description de la base de données et les présenter à l'utilisateur pour la vérification finale.
Il y a un risque inhérent au fait que les données du cache sont volatiles, mais nous n'avons jamais eu de problèmes avec cela car la redirection se fait rapidement.
Nos solutions sont similaires à une différence près. J'ai suggéré de stocker dans une base de données et vous avez sous-entendu un cache. Comment peut-il créer une mémoire commune à utiliser entre différentes sessions ?
@UgurGümüshan : Bien. La solution de base de données sera plus lente que le cache (par rapport au trafic), mais elle est persistante. Comme mentionné dans mon post, nous utilisons le hachage que nous générons du côté de l'envoi (non-ssl), pour rechercher les données du côté de la réception (ssl).
En quoi cela diffère-t-il de l'envoi de l'ID de session dans l'URL (comme mentionné dans les autres réponses) ? À part le fait qu'un hachage est peut-être plus long et plus difficile à deviner ?
Il semble que votre cookie de session soit créé avec le drapeau sécurisé, mais il y a quelque chose avec l'url de votre page de paiement à cause duquel le cookie de session n'est pas transmis.
Ou probablement, votre cookie de session n'est pas sécurisé - juste que l'url de la page de paiement est suffisamment différente ( http://mysite.com vs http://www.mysite.com ) que le navigateur n'envoie pas le cookie.
Si vous souhaitez en savoir plus sur le passage de http à https et vice versa, jetez un coup d'oeil à à mon article sur le ssl sélectif :-)
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.
1 votes
Quel navigateur utilisez-vous ? Y a-t-il des sous-domaines impliqués, tels que "www." ? Pouvez-vous reproduire le problème ailleurs ?