web-dev-qa-db-fra.com

Les variables de session ne persistent pas entre les chargements de page

Quelqu'un peut-il me dire pourquoi les vars de session ne passent pas entre les pages? Ils travaillaient il y a 2 jours. Maintenant ce n'est pas? Il existe un système tiers qui enregistre les utilisateurs en fonction du système tiers. Je dirige les utilisateurs vers la page de connexion avec l'URL de retour. Le système tiers enregistre un utilisateur et lui transmet son identifiant et un jeton, puis les renvoie sur mon site avec l'identifiant et le jeton dans l'URL.

Si les sessions ne sont pas définies, j'essaie de récupérer l'ID et le jeton dans l'URL et de définir les sessions. (travail) Je génère ensuite mon propre jeton pour le valider par rapport au jeton transmis par le système tiers (fonctionne) lorsque je clique sur une autre page, les sessions que j'ai définies ne sont pas vides (????)

Voici mon code:

    <?php
    session_start();

    // FUNCTION TO PASS THE URL THE USER IS ON SO THEY COME 
    // BACk TO THIS PAGE AFTER THE LOG IN. IF APPLICABLE
    function curPageURL() {
    $pageURL = 'http';
    if ($_SERVER["HTTPS"] == "on") {$pageURL .= "s";}
    $pageURL .= "://";
    if ($_SERVER["SERVER_PORT"] != "80") {
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    } else {
    $pageURL .= $_SERVER["SERVER_NAME"].$_SERVER["REQUEST_URI"];
    }
    return $pageURL;
    }

    // DESTROY SESSION INFO IF TIMED OUT
    if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    session_destroy();   // destroy session data in storage
    session_unset();     // unset $_SESSION variable for the runtime
    }

    // SET THE SESSIONS WITH INFO PASSED FROM
    // LOGIN PAGE SENT AS A GET
    if(isset($_SESSION['ID']) && isset($_SESSION['token'])) {}else{
    $_SESSION['ID'] = $_GET['ID'];
    $_SESSION['token'] = $_GET['token'];
    }

    // GENERATE MY TOKEN TO MATCH THE LOGIN SYSTEM TOKEN
    $userIP = $_SERVER['REMOTE_ADDR'];
    $secretkey = 'A Unique Key For The Logged In User Matching the Login System Passed From mydomain.com/login.php';
    $algorithm = 'md5';
    $mm = date('m');
    $dd = date('d');
    $mmdd = $mm.$dd;
    $mytoken = strtoupper(hash($algorithm, $secretkey.$_SESSION['ID'].$userIP.$mmdd));


    $_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp
    // THIS IS WHERE THINGS ARE GOING WRONG
// SESSION token IS NO LONG SET AFTER I Go To another page
// and my token isnt the same any more either because session ID
// is no longer set???
    if($_SESSION['token']==$mytoken){}else{
    header("location: https://mydomain.com/login.php?returnURL=".curPageURL());
    }
    ?>

ok c'est foiré. Ce doit être un problème sur la configuration de fournisseur d'hébergement PHP je pense parce que j'ai créé deux pages. un appelé info avec ce code:

<?
session_start();

$_SESSION['ID'] = "112233";
$_SESSION['token'] = "mytoken";

print $_SESSION['ID'];
print $_SESSION['token'];
?>
<a href="info2.php">info 2</a>

et un appelé info2 avec ce code:

<?
session_start();

print $_SESSION['ID'];
print $_SESSION['token'];
?>
<a href="info.php">info</a>

info créé et imprimé la session ok. Lorsque je clique sur le lien pour accéder à info2, les sessions ne sont pas imprimées. Est-ce un problème de configuration d'hébergement?

16
user520300

La réponse à cette question est qu'il s'agissait d'une erreur de configuration d'hébergement. La société d'hébergement a changé quelque chose et cela fonctionne depuis.

1
user520300

Comme déjà mentionné, assurez-vous que vous appelez session_start() sur chaque page.

De plus, les scripts sur différents sous-domaines sont-ils ?? Si tel est le cas, vous devez définir la valeur INI session.cookie_domain sur .DOMAIN.EXT.

Pour continuer à déboguer toute cette situation, effectuez une simple surveillance des cookies. Voyez si PHPSESSID est présent en tant que cookie sur les deux demandes de page, sinon, c'est votre problème. Vous ne pouvez pas stocker les cookies entre domaines à moins de les reconstruire.


En réponse à votre mise à jour, essayez de le faire sous votre appel à session_start():

echo session_id();

Confirmez que c'est la même chose sur les deux pages. Sinon, vérifiez la valeur de session.cookie_domain comme ceci:

echo ini_get('session.cookie_domain');

Est-ce que cela est réglé? Par défaut, le problème devrait être vide. S'il est défini, surtout s'il ne l'est pas pour votre domaine.

Vous pouvez également essayer de déboguer la valeur de cookie de PHPSESSID comme je l’avais suggéré au préalable.

16
Rudi Visser

Liste de contrôle
1. Assurez-vous d'avoir utilisé session_start (); dans la page suivante.

2. Utilisez-vous un fichier .htaccess?
si tel est le cas, supprimez le fichier .htaccess et cochez la même chose.
certaines règles de réécriture causent des problèmes de session ...

3. Si la session fonctionne correctement et que vous rencontrez des problèmes uniquement avec le jeton, vérifiez que le jeton envoyé dans l'URL est url_encoded.

7
Jagadeesan

ce n'est pas le problème du serveur d'hébergement ...

vérifier vos URL

si un utilisateur est connecté sous "exemple.com", la session sera enregistrée pour "exemple.com" et non pas "WWW.exemple.com". Par conséquent, si un lien accède à www.exemple.com, il ne disposera pas de cette session.

vous pouvez utiliser htaccess pour toujours définir l'URL sur "WWW.example.com" utiliser le code ci-dessous pour cela

RewriteEngine On

RewriteCond% {HTTP_Host} ^ hemantjadhav.com $ [NC]

RewriteRule ^ (. *) $ http://www.hemantjadhav.com/ $ 1 [L, R = 301]

(remplace hemantjadhav par votre nom de domaine)

3
Hemant Jadhav

Vérifiez la taille du fichier de session: (code extrait de cet article )

$sessionfile = ini_get('session.save_path') . '/' . 'sess_'.session_id();  
echo 'session file: ', $sessionfile, ' ';  
echo 'size: ', filesize($sessionfile), "\n";

Si votre fichier de session a une taille nulle, assurez-vous qu'il y a encore de l'espace disque disponible sur votre serveur. C'était le problème que j'avais.

Vérifiez l'espace disque avec df -h sur un serveur Linux.

0
grayob

Assurez-vous que les deux pages sont sur le même domaine . Même www.site.com est différent de site.com

0
user3225121