Pourquoi mes sessions ne fonctionnent plus !!

arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007
- 20 mai 2006 à 13:00
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015
- 21 mai 2006 à 21:59
Bonjour à tous,

J'ai créé un site d'anciens élèves uniquement consultable par des utilisateurs préalablement enregistrés dans ma BDD.
Sur la page d'index, j'ai un formulaire demandant un couple login/mot de passe.
J'utilise naturellement les sessions.
Il ya quelques temps je me décide à refondre le design afin d'intégrer des CSS. Depuis, mes sessions ne fonctionnent plus du tout.
Y'a t'il un rapport ? je ne crois pas.
Je travaille en local sur phpmyadmin 2.8.0.2 et mysql 5.0.19.

Voila le code de la page d'index contenant le formulaire :

$verif_query= sprintf("SELECT * FROM lh_membre WHERE login='$login' AND pass='".md5($pass)."' AND statut='$base' AND valid='1'");
mysql_real_escape_string($login);
mysql_real_escape_string($pass);
$verif = mysql_query($verif_query, $connexion) or die(mysql_error());
$row_verif = mysql_fetch_assoc($verif);
$utilisateur = mysql_num_rows($verif);
if((strcmp($login,$row_verif['login'])==0)&&(strcmp(md5($pass),$row_verif['pass'])==0)){
  if ($utilisateur) {
 session_register("authentification");
 $_SESSION['nom']       = $row_verif['nom'];
 $_SESSION['prenom']    = $row_verif['prenom'];
 $_SESSION['login']     = $row_verif['login'];
 $_SESSION['id']        = $row_verif['id'];
 $_SESSION['email']     = $row_verif['email'];
 $_SESSION['arrivee']   = $row_verif['arrivee'];
 $_SESSION['depart']    = $row_verif['depart'];
 $_SESSION['ip']        = $_SERVER['REMOTE_ADDR'];
 $_SESSION['statut']    = $row_verif['statut'];
 $_SESSION['privilege'] = $row_verif['privilege'];
 $_SESSION['visite']    = $row_verif['visite'];
 $_SESSION['bureau']    = $row_verif['bureau'];
 $_SESSION['cp']        = $row_verif['cp'];
 $_SESSION['rue']       = $row_verif['rue'];
 $_SESSION['ville']     = $row_verif['ville'];
 $_SESSION['tel']       = $row_verif['tel'];
  
$timestamp_expire = time() + 365*24*3600;
setcookie('visite', $row_verif['visite'], $timestamp_expire); 
   
 $time = (date("H") * 60) + date("i");
 $compteur = $_SESSION['visite'] + 1;
 if($row_verif['ip'] != $_SERVER['REMOTE_ADDR']){
 $sql = mysql_query("UPDATE lh_membre SET ip='".$_SESSION['ip']."', visite='$compteur' WHERE id='".$_SESSION['id']."'");
 }
header("Location: membre/accueil.php");
 }
 else{
header("Location: index.php?erreur=login");
 }
}
}
Je rajoute en plus

if(isset($_GET['erreur']) && $_GET['erreur'] == 'logout'){
session_unset('authentification');
header("Location:index.php?erreur=delog");
}

Si l'utilisateur existe, je suis bien renvoyé vers la page membre/accueil.php sinon je reste sur index.php
Jusque là, cela fonctionne

Ensuite sur ma page d'accueil.php :

session_start();
if (session_is_registered("authentification")){
}
else{
header('Location:../index.php?erreur=logout');
}
Et là, rien n'y fait. Je peux accéder à cette page même si je ne suis pas loggué.
J'ai un lien pour me delogguer (../index?erreur=logout) qui est censé effacer les variables mais rien n'y fait.

J'ai besoin d'aide SVP.
Merci d'avance

18 réponses

cs_Kysic
Messages postés
332
Date d'inscription
mardi 12 juillet 2005
Statut
Membre
Dernière intervention
17 juillet 2010

20 mai 2006 à 14:27
J'ai pas lu tout le code donc je sait pas si c'est là le seul problème, mais quand tu utilise un header pour protèger une page fait le toujours suivre d'un exit() sinon on peut accèder au reste de la page si on n'utilise pas un navigateur classique, de plus la commande header ne fonctionne pas si tu as déjà envoyé du texte avant (avec un echo par exemple), enfin à la place de

if (session_is_registered("authentification")){
}
else{
header('Location:../index.php?erreur=logout');
}

tu peux écrire:
if (!session_is_registered("authentification")){
 header('Location:../index.php?erreur=logout');
 exit();
}

(le ! signifie NOT)
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

20 mai 2006 à 16:21
Merci de ta réponse.
J'ai remplacé le code, c'est plus propre.
Ca n'a pas résolu le problème de cette session qui ne se détruit pas.
Je peux toujours accéder à la page (soit disant) protégée mettre après un session_unset().
Je suis sous IE7 beta 2 et le problème existe aussi sur firefox.
Je viens de m'apercevoir en consultant le php.ini que mon hébergeur avait remplacé PHP 4 par PHP 5.1.2 (sans m'en avertir d'ailleurs)
Est ce que cela peut avoir une incidence.
J'ai cru comprendre (mais j'ai pas très bien compris) en consultant www.php.net que certaines fonctions ne devaient pas être utilisées
Attention, ----
Si vous utilisez <var class="varname">$_SESSION</var> (ou <var class="varname">$HTTP_SESSION_VARS</var>), n'utilisez pas session_register(), session_is_registered() et session_unregister().

A vrai dire, j'y comprends plus rien. Du jour au lendemain tout part en cacahuète !
Si quelqu'un a une piste...
0
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

20 mai 2006 à 17:18
// mysql_real_escape_string juste pour login et dans la requete pas juste après

// perso je ne suis pas un amateur du sprintf ça alourdit le script pour un gain

// plus que discutable

//

// vu que tu sais dequels paramètre tu as besoin autant les demander

// directement à mysql ça sera plus rapide qu'avec un * sauf si tu n'est

// pas sur de la structure de ta table et quelle risque de changer

// donc... .. .

$verif = mysql_query('SELECT
nom,prenom,id,email,arrivee,depart,ip,statut,privilege,visite,bureau,cp,rue,ville,tel
FROM lh_membre WHERE login=\''.mysql_real_escape_string($login).'\' AND
pass=\''.md5($pass).'\' AND statut=\''.$base.'\' AND valid=\'1\'',
$connexion) or die(mysql_error());


// on vérifi que l'on a trouvé quelque chose AVANT de traiter

// le résultat (parceque forcement si y a pas de résultat)

if(mysql_num_rows($verif) > 0)

{

   // pas besoin de faire une comparaison de nom et de pass puisque tu l'as fait

   // sous forme de condition dans ta requete SQL

  

   // on met directement toutes les infos dans la session et on rajoutera ce qu'il manque

   $_SESSION = mysql_fetch_assoc($verif);

  

   $_SESSION['authentification'] = true;

  

   // on met le cookie

    setcookie('visite', $_SESSION['visite'], time() + (365*24*3600));

   

    $time = (date("H") * 60) + date("i");

    // on met à jour les visites

    $_SESSION['visite']++;

   

    // je vois pas l'interet de stocker en bdd dans ce cadre là...

    // ça te prend de la place pour pas grand chose.. .

    if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])

    {

        $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];

        // je suppose que id est numérique dans ce cas pas besoin de ''

        $sql = mysql_query('UPDATE
lh_membre SET ip=\''.$_SESSION['ip'].'\', visite=\''.$compteur.'\'
WHERE id='.$_SESSION['id']);

    }

   

    // par contre il peut être interessant de stocker une variable spéciale

    // pour eviter le vol de session... par exemple

    $checkplus = $_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['HTTP_ACCEPT_CHARSET'];

   

    if(isset($_ENV['USERDOMAIN'])) $checkplus .= $_ENV['USERDOMAIN'];

    if(isset($_ENV['COMPUTERNAME'])) $checkplus .= $_ENV['COMPUTERNAME'];

    if(isset($_ENV['PROCESSOR_IDENTIFIER'])) $checkplus .= $_ENV['PROCESSOR_IDENTIFIER'];

   

    $_SESSION['userCheck'] = md5($_SESSION['ip'].$checkplus)

   

   

    header('Location: membre/accueil.php');

    // on termine toujours le script après un header('location: ...

    exit();

}

else

{

    header('Location: index.php?erreur=login');

    // on termine toujours le script après un header('location: ...

    exit();

}


if(isset($_GET['erreur']) && $_GET['erreur'] == 'logout')

{

    // on vire la session

    $_SESSION = array();


    if (isset($_COOKIE[session_name()]))

        setcookie(session_name(), false, time()-42000);


    session_destroy();

   

    header('Location: index.php?erreur=delog');

    // on termine toujours le script après un header('location: ...

    exit();

}


Ensuite pour ta page d'accueil


session_start();

if (isset($_SESSION['authentification']) && $_SESSION['authentification'] == true)

{

    $checkplus = $_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['HTTP_ACCEPT_CHARSET'];

   

    if(isset($_ENV['USERDOMAIN'])) $checkplus .= $_ENV['USERDOMAIN'];

    if(isset($_ENV['COMPUTERNAME'])) $checkplus .= $_ENV['COMPUTERNAME'];

    if(isset($_ENV['PROCESSOR_IDENTIFIER'])) $checkplus .= $_ENV['PROCESSOR_IDENTIFIER'];

   

    if($_SESSION['userCheck'] != md5($_SERVER['REMOTE_ADDR'].$checkplus))

    {

        header('Location: ../index.php?erreur=logout');

        // on termine toujours le script après un header('location: ...

        exit();

    }

}

else

{

    header('Location: ../index.php?erreur=logout');

    // on termine toujours le script après un header('location: ...

    exit();

}

@ tchaOo°

l'homme est un loup pour l'homme... .. .
0
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

20 mai 2006 à 17:22
Zut j'ais oublié...


remplacer


$compteur


par


$_SESSION['visite']


dans la requete d'update


et


$time = (date("H") * 60) + date("i");


ne sert à rien... en tout cas dans le code présent... .. .


@ tchaOo°

l'homme est un loup pour l'homme... .. .
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

20 mai 2006 à 17:25
Je te remercie sincèrement de ta réponse et du temps que tu y as consacré.
Je vais étudier tout cela bien en détail et si j'ai un problème, je reposte.
A+

Arno
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

20 mai 2006 à 18:23
Je saisi pas bien la partie sur la page d'accueil.

L'authentification semble se faire correctement puisque j'arrive sur accueil.php mais je tombe sur une page blanche sans message d'erreur particulier.
De plus cette fonction de verif ne fonctionne pas en local.
Tu vois une solution ?
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

20 mai 2006 à 18:25
En local, j'obtiens ceci :

Notice: Undefined index: HTTP_ACCEPT_CHARSET in d:\sites web\easyphp1-8\www\hotellerieplus\index.php on line 27

Warning: Cannot modify header information - headers already sent by (output started at d:\sites web\easyphp1-8\www\hotellerieplus\index.php:27) in d:\sites web\easyphp1-8\www\hotellerieplus\index.php on line 34

La ligne 34 correspond à
header('Location: membre/accueil.php');
0
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

20 mai 2006 à 18:54
remplace...

$checkplus = $_SERVER['HTTP_ACCEPT_LANGUAGE'].$_SERVER['HTTP_ACCEPT_CHARSET'];

   

par


$checkplus = $_SERVER['HTTP_USER_AGENT'];


  if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $checkplus .= $_SERVER['HTTP_ACCEPT_LANGUAGE']

if(isset($_SERVER['HTTP_ACCEPT_CHARSET'])) $checkplus .= $_SERVER['HTTP_ACCEPT_CHARSET']


@ tchaOo°

l'homme est un loup pour l'homme... .. .
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

20 mai 2006 à 19:07
Bon je l'ai remplacé dans accueil.php, ca donne

session_start();


if (isset($_SESSION['authentification']) && $_SESSION['authentification'] == true)
{
 $checkplus = $_SERVER['HTTP_USER_AGENT'];


   if(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) $checkplus .= $_SERVER['HTTP_ACCEPT_LANGUAGE'];
 if(isset($_SERVER['HTTP_ACCEPT_CHARSET'])) $checkplus .= $_SERVER['HTTP_ACCEPT_CHARSET'];
   
    if($_SESSION['userCheck'] != md5($_SERVER['REMOTE_ADDR'].$checkplus))
    {
        header('Location: ../index.php?erreur=logout');
        exit();
    }
}
else
{
    header('Location: ../index.php?erreur=logout');
    exit();
}

Je l'ai remplacé également dans index. L'utilisateur valide n'est plus reconnu. Impossible d'accéder à accueil.php
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

20 mai 2006 à 19:08
Et en local ca varie un peu...

Warning: session_destroy(): Trying to destroy uninitialized session in d:\sites web\easyphp1-8\www\hotellerieplus\index.php on line 51

Warning: Cannot modify header information - headers already sent by (output started at d:\sites web\easyphp1-8\www\hotellerieplus\index.php:51) in d:\sites web\easyphp1-8\www\hotellerieplus\index.php on line 53

L53 :     header('Location: index.php?erreur=delog');
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

21 mai 2006 à 10:56
J'ai fait plusieurs tests mais j'ai l'impression que mes varibales de session ne sont pas créées.

Sur la page index.php, je suis arrivé à cela :

if(mysql_num_rows($verif) > 0)
{
   $_SESSION = mysql_fetch_assoc($verif);
   $_SESSION['authentification'] == true;
  
    setcookie('visite', $_SESSION['visite'], time() + (365*24*3600));
   
    $_SESSION['visite']++;
   
    if($_SESSION['ip'] != $_SERVER['REMOTE_ADDR'])
    {
        $_SESSION['ip'] = $_SERVER['REMOTE_ADDR'];
        $sql = mysql_query('UPDATE lh_membre SET ip=\''.$_SESSION['ip'].'\', visite=\''.$_SESSION['visite'].'\' WHERE id='.$_SESSION['id']);
    }
   
 $checkplus = $_SERVER['HTTP_USER_AGENT'];
   
    $_SESSION['userCheck'] = md5($_SESSION['ip'].$checkplus);
    header('Location: membre/accueil.php');
    exit();
}
else
{
    header('Location: index.php?erreur=index1');
    exit();
}
}

Si le login/mdp n'est pas bon, j'arrive bien sur index.php?erreur=index1
L'inverse me renvoie bien sur accueil.php

Sur la page d'accueil :
session_start();
require_once("../includes/connexion.php");


if ($_SESSION['authentification'] = true)
{
 
 $checkplus = $_SERVER['HTTP_USER_AGENT'];


    if($_SESSION['userCheck'] != md5($_SERVER['REMOTE_ADDR'].$checkplus))
    {
        header('Location: ../index.php?erreur=erreur1');
        exit();
    }
}
else
{
    header('Location: ../index.php?erreur=erreur2');
    exit();
}

J'ai supprimé isset($_SESSION['authentification']) qui me renvoyait systématiquement sur erreur=erreur2
Avec if ($_SESSION['authentification'] = true), je suis renvoyé sur erreur=erreur1
Si je fais par ex un echo $_SESSION[userCheck], je n'ai rien ni en local ni sur le serveur.

Je vois pas du tout ce qui cloche ??
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

21 mai 2006 à 11:05
J'ai remis isset($_SESSION['authentification']) dans accueil.php.
Un accès direct à la page me renvoie erreur1 au lieu d'erreur2
0
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

21 mai 2006 à 16:20
if (isset($_SESSION['authentification']) &&  $_SESSION['authentification'] == true))


sinon en page d'accueil fais


echo '';

print_r($_SESSION);

die('

');


pour voir ce que ça donne... .. .


@ tchaOo°

l'homme est un loup pour l'homme... .. .
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

21 mai 2006 à 17:11
J'avais déjà remplacé  = true par ==true, pas de changement
J'ai inséré ton code et j'obtiens à unarray vide
array
(
)
ce qui confirme que les variables de session n'existent pas
0
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

21 mai 2006 à 17:17
Qu'est ce qu'il y a dans ton fichier "includes/connexion.php"


Sinon vérifis la config des sessions dans ton php.ini... .. .


@ tchaOo°

l'homme est un loup pour l'homme... .. .
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

21 mai 2006 à 17:21
$hostname = "localhost";
$database = "xxx";
$username = "xxxxxx";
$password = "xxxxxxxxx";
$connexion = mysql_pconnect($hostname, $username, $password) or die(mysql_error());
mysql_select_db($database, $connexion);

Une partie des infos données par php_info()

session
Session Support, enabled, ----
Registered save handlers, files user

Directive |Local Value |Master Value |----
session.auto_start, Off, Off, ----
session.bug_compat_42, Off, Off, ----
session.bug_compat_warn, On, On, ----
session.cache_expire, 180, 180, ----
session.cache_limiter, nocache, nocache, ----
session.cookie_domain, no value, no value, ----
session.cookie_lifetime, 0, 0, ----
session.cookie_path, /, /, ----
session.cookie_secure, Off, Off, ----
session.entropy_file, no value, no value, ----
session.entropy_length, 0, 0, ----
session.gc_divisor, 1000, 1000, ----
session.gc_maxlifetime, 1440, 1440, ----
session.gc_probability, 1, 1, ----
session.name, PHPSESSID, PHPSESSID, ----
session.referer_check, no value, no value, ----
session.save_handler, files, files, ----
session.save_path, D:/Sites web/EasyPHP1-8\tmp\, D:/Sites web/EasyPHP1-8\tmp\, ----
session.serialize_handler, php, php, ----
session.use_cookies, On, On, ----
session.use_only_cookies, Off, Off, ----
session.use_trans_sid, Off, Off
0
arnold002
Messages postés
121
Date d'inscription
mercredi 27 octobre 2004
Statut
Membre
Dernière intervention
5 mars 2007

21 mai 2006 à 20:21
Ca y est j'ai retravaillé tout ça.
Les variables de session se créent normalement.
Par contre j'ai un problème de header(). Le renvoi vers la page concernée ne fonctionne pas.
J'ai bien recherché espaces et autres codes avant mais j'ai rien trouvé.

Chose bizarre... Cela fonctionne correctement si je rajoute un session_register('authentification') sur la page d'index
0
kankrelune
Messages postés
1293
Date d'inscription
mardi 9 novembre 2004
Statut
Membre
Dernière intervention
21 mai 2015

21 mai 2006 à 21:59
Met session_start() au début de l'index... .. .


@ tchaOo°

l'homme est un loup pour l'homme... .. .
0