Page 1 sur 2

session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 17:02
par dogmongo
Bonjour,

M'obligeant à travailler en mode registre globale à OFF, je ne parviens pas à garder une session active, dès le premier changement de page elle disparaît, quelqu'un pourrait me dire d'ou ce phénomène peut venir ?

Je vous remercie par avance

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 17:40
par dogmongo
Ça vous parlera peu être mieux si je vous montre mon fichier de session
<?php
$s_Login  = (isset($_POST['s_Login']))  ? mysql_real_escape_string($_POST['s_Login'])  : '';
$s_Pass   = (isset($_POST['s_Pass']))   ? mysql_real_escape_string($_POST['s_Pass'])   : '';

$s_Login  = md5($s_Login);
$s_Pass   = sha1($s_Pass ) ;


if($s_Login!="" | $s_Pass!=""){
  
 $sql  = "SELECT * ".
            "FROM source_clients ".
            "WHERE email='" . $s_Login . "' ".
            "  AND pass='" . $s_Pass . "' ";
			
    $query = mysql_query($sql);
	
	
	$nb_result = mysql_num_rows($query);
                
	if($nb_result>0) 
	{			
    
			while($row = mysql_fetch_array($query)) 
			      {
                              $userID = $row['userID'];
                              $S_membre['id']          = $row['id'];
                              $S_membre['clt_tel']     = $row['clt_tel'];
                              $S_membre['clt_gsm']     = $row['clt_gsm'];
                              $S_membre['clt_faxe']    = $row['clt_faxe'];
                              $S_membre['clt_digicode']= $row['clt_digicode'];
                              $S_membre['clt_ste']     = $row['clt_ste'];
                              $S_membre['clt_civilite']= $row['clt_civilite'];
                              $S_membre['clt_apparte'] = $row['clt_apparte'];
                              $S_membre['clt_bat']= $row['clt_bat'];
                              $S_membre['clt_cp']= $row['clt_cp'];
			      $S_membre['clt_ville'] = $row['clt_ville'];
                              $S_membre['clt_bp']= $row['clt_bp'];
                              $S_membre['clt_bat']= $row['clt_bat'];
                              $S_membre['prenom'] = $row['prenom'];							  
                              $S_membre['nom'] = $row['nom'];
                              $S_membre['adresse'] = $row['adresse'];
                              $S_membre['email'] = $row['email'];
                              $S_membre['class'] = $row['class'];
                              $S_membre['pass'] = $row['pass'];
                              $S_membre['date'] = $row['date'];
							  
							  if($MembreID=="") { 

                              $MembreID = md5(uniqid(rand(), true));
							  
							    $sql  = "UPDATE ".
								"source_clients ".
								"SET userID='" . $MembreID . "' ".
								"  WHERE id='" . $S_membre['id'] . "' ";
    						   
							    $query = mysql_query($sql);
							  
                         		}
								 
							  $_SESSION['S_membre'] = $S_membre;

                              $cookietime = time() + (86400*$temp_vie_cookie); // prolonge le cookie
                              setcookie("MembreID", $MembreID, $cookietime);
							  
							  unset($p);
							  $_SESSION['s_p'] = null;
							  $_SESSION['p'] = null;
							  
 							  
							  if($_SERVER['SCRIPT_NAME'] == "/index.php") {header("Location: index.php");}
                              }
							  
							 // echo "Utilisateur trouvé";



							 }else{ 

							 //echo "Utilisateur non trouvé ";
												 
							 }


}





				
//if($_COOKIE['MembreID']) 
if(!empty($_COOKIE['MembreID'])){ // si le cookie existe

 $sql  = "SELECT * ".
            "FROM source_clients ".
            "WHERE userID='" . $MembreID . "' ";
			
    $query = mysql_query($sql);
	
                while($row = mysql_fetch_array($query)) 
                           {
                              $MembreID = $row['userID'];
                              $S_membre['id'] = $row['id'];
                              $S_membre['clt_tel']= $row['clt_tel'];
                              $S_membre['clt_gsm']= $row['clt_gsm'];
                              $S_membre['clt_faxe']= $row['clt_faxe'];
                              $S_membre['clt_digicode']= $row['clt_digicode'];
                              $S_membre['clt_ste']= $row['clt_ste'];
                              $S_membre['clt_civilite']= $row['clt_civilite'];
                              $S_membre['clt_apparte']= $row['clt_apparte'];
                              $S_membre['clt_bat']= $row['clt_bat'];
                              $S_membre['clt_cp']= $row['clt_cp'];
			      $S_membre['clt_ville'] = $row['clt_ville'];
                              $S_membre['clt_bp']= $row['clt_bp'];
                              $S_membre['clt_bat']= $row['clt_bat'];
                              $S_membre['prenom'] = $row['prenom'];							  
                              $S_membre['nom'] = $row['nom'];
                              $S_membre['adresse'] = $row['adresse'];
                              $S_membre['email'] = $row['email'];
                              $S_membre['class'] = $row['class'];
                              $S_membre['pass'] = $row['pass'];
                              $S_membre['date'] = $row['date'];

			      $_SESSION['S_membre'] = $S_membre;
                              $cookietime = time() + $temp_vie_cookie; // prolonge le cookie
                              setcookie("MembreID", $MembreID, $cookietime);
                              }	
						  
}

?>

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 19:02
par moogli
salut,

- $MembreID n'existe pas ton if ne sert à rien
- pas de session_start() pas de session tout court :)

tuto sur le sujet http://www.lephpfacile.com/cours/18-les-sessions

@+

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 19:12
par dogmongo
session_start() est appelé sur d'autre page ou j'inclus celle-ci

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 19:24
par dogmongo
Pourquoi me dit-tu que $MembreID n'existe pas ?
cette variable est la clé de ma session

si un accès est demandé une comparaison est faites via $MembreID = $row['userID'];
qui devient par la même occasion ma session

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 20:06
par moogli
dans le code que tu founis il n'y a pas de session_start().

toujours dans ce même code lorsque tu fais if ($MembreID == "") . Ma variable $MembreID c'est affectée null part !
d'ailleurs il serait p'tet plus "optiomisé" de faire ce contrôle avant pour éviter une requete sql inutile.

les whiles que tu utilise sont totalement inutile parce que :
- un membre n'a qu'un seul compte (sinon c'est la merde assurée avec le même login).
- avec ton code, dans le cas où il y aurait plusieurs lignes, seule la dernière tu jeux de résultat serais prise en compte ;)

if ($s_Login != "" | $s_Pass != "") { => tu te connecte avec soit le login soit le mot de passe ? pratique coté usurpation d'identité ;)

$userID = $row['userID'];
$S_membre['id'] = $row['id'];
tu as deux identifiants dans la même table ? si oui => inutile.

unset($p); => aucune trace null part dans le code
$_SESSION['s_p'] = null; idem
$_SESSION['p'] = null; idem

if ($_SERVER['SCRIPT_NAME'] == "/index.php") {
header("Location: index.php");
}
si tu n'es pas sur l'index tu reste sur une page blanche ?

$s_Login = (isset($_POST['s_Login'])) ? mysql_real_escape_string($_POST['s_Login']) : '';
$s_Pass = (isset($_POST['s_Pass'])) ? mysql_real_escape_string($_POST['s_Pass']) : '';

inutile sha1 ou md5 ne retourne pas de chaînes avec des caractères qui peuvent corrompre la requête sql (c'est que de l'hexa), mais pourquoi pas.

au final je ferais ton code dans se style :
<?php
session_start();
if(!empty($_SESSION['S_membre']['id'])){
    // déja connecté retour case précédente. Un message serait une bonne idée !
    header('Location: '.$_SERVER['HTTP_REFERER']);
    exit();
}
$temp_vie_cookie = 12456789;

if (!empty($_POST['s_Login']) && !empty($_POST['s_Pass'])) {

    $sql = 'SELECT *
        FROM source_clients
        WHERE email = md5(\'' . mysql_real_escape_string($_POST['s_Login']) . '\' )';

    $query = mysql_query($sql);
    if ($query !== false) {
        $row = mysql_fetch_array($query);
        if ($row !== false) {
            // on libère la ressource
            mysql_free_result($query);
            if ($row['pass'] == sha1($_POST['s_Pass'])) {
                unset($row['pass']); // info inutile en session
                $_SESSION['S_membre'] = $row;
                $MembreID = md5(uniqid(rand(), true));
                if (empty($row['userID'])) {
                    $sql = 'UPDATE source_clients
                        SET userID= \'' . $MembreID . '\'
                         WHERE id = ' . $_SESSION['S_membre']['id'];
                    if (mysql_query($sql) === false) {
                        // erreur à la mise à jour de la table
                    }
                }
                $cookietime = time() + (86400 * $temp_vie_cookie); // prolonge le cookie
                setcookie("MembreID", $MembreID, $cookietime);
                header("Location: index.php");
            } else {
                // mdp ko
            }
        } else {
            // pas de résultat  donc utilisateur inconnu
        }
    } else {
        // erreur SQL, => mysql_error();
    }
} else {
    //echo "Utilisateur non trouvé ";
}

// auto connexion ?

if (!empty($_COOKIE['MembreID'])) { // si le cookie existe

    $sql = 'SELECT *
        FROM source_clients
        WHERE userID=' . mysql_real_escape_string($MembreID); // <= c'est un entier je suppose ? si oui pas de ' ce n'est pas une chaine de caractère.

    $query = mysql_query($sql);

    if ($query !== false) {
        $row = mysql_fetch_array($query);
        if ($row !== false) {
            mysql_free_result($$query); // important
            unset($row['pass']); // info inutile en session
            $_SESSION['S_membre'] = $row;
            $cookietime = time() + $temp_vie_cookie; // prolonge le cookie
            setcookie("MembreID", $_COOKIE['MembreID'], $cookietime);
        } else {
            // utilisateur inconnu !
        }
    } else {
        // erreur sql tu as le message avec myslq_error()
    }
}
pour les requêtes plutôt qu'un select * indiquer les noms des champs est une meilleur idée pour la lisibilité du code et éviter de ramener des trucs inutile (genre le mot de passe ne sert qu'a la connexion).

@+

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 20:32
par dogmongo
Tu as carrément raison sur plein de point
double compte = bug (j'ai connu)
requête inutile
while inutile

si j'insiste autant sur l'encodage c'est que j'ai été piraté et je ne veux plus qu'un petit malin puisse en faire quelque chose, mon champ Login st en faites mail ;)

je viens de testé ton code et le tuto que tu m'a fais passer précédemment mais le problème reste persistant, les sessions ne reste pas en place, je ne comprend vraiment pas !

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 20:34
par dogmongo
oui pour la page blanche :?

je réédite pour te dire que ce code me crée une page blanche sur le site
if(!empty($_SESSION['S_membre']['id'])){
    // déja connecté retour case précédente. Un message serait une bonne idée !
    header('Location: '.$_SERVER['HTTP_REFERER']);
    exit();

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 21:00
par dogmongo
j'ai créer des echo pour savoir ce qu'il ce passe

j'obtiens:
Utilisateur non trouvé
erreur sql tu as le message avec myslq_error()

Re: session_start() + registre globale OFF plus de session

Posté : 21 oct. 2013, 22:25
par moogli
affiche le message d'erreur s'il y a (avec la fonction mysql_error()

@+

Re: session_start() + registre globale OFF plus de session

Posté : 22 oct. 2013, 09:07
par dogmongo
affiche le message d'erreur s'il y a (avec la fonction mysql_error()
@+

erreur sql tu as le message avec mysql_error(SELECT * FROM source_clients WHERE userID=)

apparemment il saute toute la premiere étape et $MembreID est vide

Re: session_start() + registre globale OFF plus de session

Posté : 22 oct. 2013, 11:45
par yann18
registre global mis à off(alors qu'il devrait l'être sans même y toucher) plus session laissent penser que ton code n'est pas compatible PHP5. De plus l'appel à tes variables de session(qui ne sont jamais définies donc inexistantes) confirme que ton code source fonctionnait avec register_gobal à on .register_gobal à on compremet fortement la sécurité de ton site

Re: session_start() + registre globale OFF plus de session

Posté : 22 oct. 2013, 12:05
par dogmongo
et j'en ai fait les frais, je me suis fais pirater, d'ou ma directive de sécurisé mon site en changeant mes habitude et mon codage mais ça me fais un trop gros changement d'un coup, j'ai du mal à suivre au niveau des sessions.

Re: session_start() + registre globale OFF plus de session

Posté : 22 oct. 2013, 19:53
par dogmongo
En pratiquant quelques test sur ton code, j'ai constaté qu'il fonctionnait plutôt bien; mais que comme mon code la session ne restait pas en place, peu être que tu verra un truc qui cloche dans ma config php.ini ?

Code : Tout sélectionner

session.save_handler = files session.save_path = "/var/lib/php/session" session.use_cookies = 1 ;session.cookie_secure = session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 1 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.bug_compat_42 = Off session.bug_compat_warn = Off session.referer_check = session.entropy_length = 0 session.entropy_file = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.hash_function = 0 session.hash_bits_per_character = 5 url_rewriter.tags = "a=href,area=href,frame=src,input=src,form=fakeentry"
dog

Re: session_start() + registre globale OFF plus de session

Posté : 22 oct. 2013, 20:13
par dogmongo
bon et bien finalement rien à voir, j'ai réactivé registre globale ON pour voir; et mes sessions remarche de nouveau

donc conclusion pas un problème de php.ini mais bien de codage #-o