Session PHP HTTP à HTTPS problème
J'ai un (HTTPS) login.php la page qui reste HTTPS (c'est à dire une fois que l'utilisateur est connecté en va de tableau de bord du compte). Maintenant, le problème est de dire à l'utilisateur tout en étant connecté sur le tableau de bord sécurisé clique sur un non-sensible à la page (HTTP) about-us.php page, la session n'est pas transmis sur HTTP comme j'ai de la session.cookie_secure=1, ce qui signifie que l'utilisateur apparaît déconnecté sur HTTP pages.
Toutefois, lorsque l'utilisateur revient à la page de tableau de bord ou tout sensible à la page de compte j'ai déjà dit qu'il devrait toujours être connecté (c'est à dire de HTTP vers HTTPS)? Cependant, ce n'est pas le cas et il semble déconnecté sur la connexion HTTPS trop?
Je crois que je suis absent quelque chose qui est à l'origine de ce problème. Voici mon code:
C'est PHP fichier d'en-tête qui est appelé à démarrer la session sur login.php page:
session_start();
session_regenerate_id(true); /*avoid session fixation attempt*/
/*Create and check how long session has been started (over 5 mins) regenerate id - avoid session hijack*/
if(!isset($_SESSION['CREATED']))
{
$_SESSION['CREATED'] = time();/*time created session, ie from login/contact advertiser/email_confirm only ways for new session to start*/
}
elseif(time() - $_SESSION['CREATED'] > 300)
{
/*session started more than 5 mins(300 secs) ago*/
session_regenerate_id(true); /*change session ID for the current session and invalidate old session ID*/
$_SESSION['CREATED'] = time(); /*update creation time*/
}
/*Check if user is logged in*/
if(!isset($_SESSION['loggedin']))
{
$_SESSION['loggedin']=1;/*used to track if user is logged in on pages*/
}
/*if return false browser supports standard ob_start();*/
if(ob_start("ob_gzhandler")){ob_start();}
C'est PHP fichier d'en-tête nécessaires sur chaque page pour vérifier si d'initiation de session déjà:
session_start();
$session_errors=0;/* if>0 user not logged in*/
/*check if session is already initiated*/
if(isset($_SESSION['CREATED']))
{
if(time() - $_SESSION['CREATED'] > 300)
{
/*session started more than 5 mins(300 secs) ago*/
session_regenerate_id(true); /*change session ID for the current session and invalidate old session ID*/
$_SESSION['CREATED'] = time(); /*update creation time*/
}
}
elseif(!isset($_SESSION['CREATED'])){$session_errors++;}/*user not logged in*/
/*Check if user is logged in*/
if(!isset($_SESSION['loggedin'])){$session_errors++;}/*user not logged in*/
if(ob_start("ob_gzhandler")){ob_start();}
Également si toute utilisation c'est le code pour activer HTTPS de non confidentielles sur des pages telles que about-us.php
if ($_SERVER['SERVER_PORT']!=80)
{
$url = "http://". $_SERVER['SERVER_NAME'] . ":80".$_SERVER['REQUEST_URI'];
header("Location: $url");
}
Mon php.ini fichier de paramètres des cookies
session.cookie_secure=1
session.cookie_httponly=1
session.use_only_cookies=1
session.cookie_lifetime = 0
session.save_path = /tmp
session.save_handler = files
Voir la question ci-dessus (ne pas suivre ses suggestions tout de même), lorsque l'utilisateur déplace à la connexion http, le cookie n'est pas transféré, donc quand
session_start()
est appelé, il génère un nouvel ID de session, donc de la précédente session id est perdu.J'ai lu le thread et le seul moyen semble être de définir cookie de sécurité drapeau à "Off". Mais ce n'est sûrement l'insécurité cant mon session_id alors être détecté sur une page HTTP? Je ne veux pas envoyer session_id URL énorme faille de sécurité.
yup, c'est un trou de sécurité énorme, c'est pourquoi je vous ai dit de ne pas suivre ses suggestions 🙂 - j'ai une solution, posté comme une réponse ci-dessous, si elle ne peut pas être la solution que vous voulais.
OriginalL'auteur daza166 | 2011-05-07
Vous devez vous connecter pour publier un commentaire.
Répondu à aider les personnes qui pourraient tomber sur ce
Comme la réponse à Session perdu lors de la commutation de HTTP à HTTPS en PHP a conclu, puisque vous utilisez
session.cookie_secure = 1
le cookie qui contient l'ID de session n'est pas transférée lors de la connexion des interrupteurs de HTTPS en HTTP. Lors de la connexion HTTP, lorsque voussession_start()
, PHP crée un nouvel identifiant de session, qui remplace la précédente session id.La réponse suggère aussi une solution, passer l'id de session à l'aide de la chaîne de requête, qui est ensuite repris par la page. Ça sent mauvais de la faille de sécurité. N'oubliez pas la raison pour laquelle nous avons utilisé le protocole HTTPS en premier lieu!
Donc la solution que je vous suggérer, c'est que vous rediriger toutes les requête http vers https homologues. Utiliser HTTPS pour tout votre site, à partir de css, les images, à de banals pages html statiques. C'est effectivement quelque chose que chaque application qui est sérieux au sujet de la sécurité. Par exemple, la visite de github page à l'aide du protocole HTTP retour:
Rappelez-vous pourquoi vous avez utilisé le protocole HTTPS en premier lieu, si vous voulez être totalement sécurisé, utilisez le protocole HTTPS pour tout.
De détecter si la demande est HTTPS ou pas (Voir à cette question) à bootstrap.
Si la demande est HTTP, soit rediriger toutes les requêtes HTTPS page d'accueil, ou vous pouvez essayer d'analyser
$_SERVER['REQUEST_URI']
et la redirection de la requête HTTP à leurs HTTPS homologue à l'aide deparse_url
ethttp_build_url
.Deuxième Solution Alternative
Si vraiment vous ne voulez vraiment pas à utiliser le protocole HTTPS pour tout, alors ne pas
session_start()
sur les pages qui sont accessibles avec HTTP. Sécuriser les cookies seront conservés lorsque vous faites cela.Troisième Solution Alternative
L'autre solution est d'essayer et de détecter l'utilisateur par des adresses IP et de l'agent utilisateur. Ce n'est pas garanti pour être précis, donc, ce que je suggère, c'est juste utiliser le protocole HTTPS pour tout. Paypal, par exemple, toujours utiliser le protocole HTTPS, même pour banals pages statiques.
cette déclaration fait partie d'une autre solution, mis à jour afin de le rendre plus clair
suffit d'utiliser HTTPS pour tout, même pour les non-utilisateur connecté.
merci pour l'info, j'ai décidé d'utiliser le protocole HTTPS sur toutes les pages, tout semble méthode la plus simple plutôt que d'avoir à plus de compliquer les choses.
OriginalL'auteur rickchristie
La description par @rickchristie est bonne, mais je pense qu'il y a une meilleure solution qu'il ne suggère pas. Si vous n'avez pas toujours envie d'utiliser le protocole HTTPS (ce qui est logique, parfois; la about_us page n'a pas besoin d'être sécurisé), vous pouvez suivre les conseils sur la
session_start
page et l'utiliser nommé sessions de continuer une session précédente. C'est simple à utiliser; il suffit d'inclure lessession_start
appels avecsur toutes les pages sécurisées.
OriginalL'auteur eykanal