Problème de sessions.

Fermé
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024 - 9 juin 2019 à 16:18
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 - 23 févr. 2020 à 11:09
Bonjour,

Afin d'essayer de comprendre d'où provient la cause de non fonctionnement de la transmission de valeurs par session PHP, j'ai d'abord repris les bases que voici avec un fichier nommé envoi.php et un autre reception.php.
envoi.php:
<?php
session_start ();
$_SESSION['username']="Pierre";
if (!empty ($_SESSION['username']))
    {
        $x=24;
        $_SESSION['calcul']=$x;
        header ("Refresh: 1;URL=./reception.php");//Délais d'une seconde avant d'appeler le fichier reception.php.
        echo "Bonjour";
        echo "<br/>";
        echo $_SESSION['username'];
    }
    else
        echo "La session username ne possède pas de valeur ou est vide.";
exit("<br/> Stop.");
?>


reception.php:
<?php
session_start ();
echo $_SESSION['calcul'];
echo "</br>";
echo $_SESSION['username'];
echo "</br>";
echo "Fichier reception.php ouvert";
?>


Voici les résultats en image attestant que ces codes fonctionnent:
L'envoi:

Puis la réception:


Puis création d'un dysfonctionnement en supprimant la ligne 3.
$_SESSION['username']="Pierre";

du fichiers envoi.php dont voici le résultat:
<?php
session_start ();
if (!empty ($_SESSION['username']))
    {
        $x=24;
        $_SESSION['calcul']=$x;
        header ("Refresh: 1;URL=./reception.php");//Délais d'une seconde avant d'appeler le fichier reception.php.
        echo "Bonjour";
        echo "<br/>";
        echo $_SESSION['username'];
    }
    else
        echo "La session username ne possède pas de valeur ou est vide.";
exit("<br/> Stop.");
?>

Le dysfonctionnement se fait bien comme prévu et comme l'atteste l'image ci dessous:


Voici désormais l'anomalie qui me préoccupe et dont je n'en trouve pas la cause:
En toute logique et à la lecture de ce qui est écrit ci dessus je pense avoir localisé le fichier en défaut que voici:
login.inc.php
<?php
session_start();

if (isset($_GET['logout']))
{
	session_unset( ); // delete the session
	setcookie('WebChessData','DELETED!',time( ) - 3600); // delete the cookie
	header('Location: login.php'); // redirect to the login page
	exit;
}
call($_POST);

// si nous essayons d'enregistrer un nouveau nom
if (isset($_POST['register']))
{
	// tester le mot de passe.
	if ( ! isset($_SESSION['token']) || ($_SESSION['token'] != $_POST['token']))
	{
		call($GLOBALS);
		die('Erreure détectée.<br /><br />Si vous avez atteint cette page par erreur, veuillez revenir à la page de connexion, effacer votre cache, actualiser la page et essayer de vous reconnecter.');
	}

	// définir l'indicateur 'tentative de connexion'
	$new_user = true;

	// check for existing user with same username
	$query = "
		SELECT p_id
		FROM ".T_PLAYER."
		WHERE p_username = '".sani($_POST['txtUsername'])."'
	";
	$mysql->query($query, __LINE__, __FILE__);

	if (0 < $mysql->num_rows( ))
	{	
		if($_POST['txtUsername'] == ''){
			echo '<script type="text/javascript"> window.location.replace(\'newuser.php\');</script>';
			exit( );
		}else{
			echo '<script type="text/javascript">alert("Ce pseudo est déjà pris."); window.location.replace(\'newuser.php\');</script>';
			exit( );
		}	


	}

	call(password_make($_POST['pwdPassword']));
    $passe = htmlspecialchars(trim($_POST['pwdPassword']));
	$query = "
		INSERT
		INTO ".T_PLAYER."
		SET p_password = '".password_make($_POST['pwdPassword'])."'
			, p_username = '".sani($_POST['txtUsername'])."'
			, p_first_name = 'Nom N°1'
			, p_last_name = 'Nom N°2'
			, p_theme = 'Style A'
			, p_motpasse = '".$passe."'
	";

	if ($CFG_USEEMAIL)
	{
		$query .= "
			, p_email = '".sani($_POST['txtEmail'])."'
		";
	}

	$query .= "
			, p_created = NOW( )
	";
	$mysql->query($query, __LINE__, __FILE__);

	// définir la session var afin que nous soyons connectés ci-dessous
	$_SESSION['player_id'] = $mysql->fetch_insert_id( );

	// ajouter tous les messages globaux pour l'utilisateur
	$Message = new Message($_SESSION['player_id']);
	$Message->grab_global_messages( );
}


// if we are already logged in, and there is nobody attempting to log in... - si nous sommes déjà connectés et que personne ne tente de se connecter ...
if (isset($_SESSION['player_id']) && ! isset($_POST['login']) && ( ! empty($_SESSION['GAME']) && ('WebChess2-'.$CFG_SITENAME.'-'.$CFG_MAINPAGE == $_SESSION['GAME'])))
{
	call('REFRESH LOGIN');
	// just refresh the session data with the (possibly new) database data - actualisez simplement les données de session avec les données (éventuellement nouvelles) de la base de données
	$query = "
		SELECT *
		FROM ".T_PLAYER."
		WHERE p_id = '{$_SESSION['player_id']}'
	";
	$player = $mysql->fetch_assoc($query, __LINE__, __FILE__);
	$refreshPlayer = true;
}
// or if we have a cookie, log in using the cookie data - ou si nous avons un cookie, connectez-vous en utilisant les données du cookie
elseif (isset($_COOKIE['WebChessData']) && ('DELETED!' != $_COOKIE['WebChessData']) && ! isset($_POST['login']))
{
	call('COOKIE LOGIN');
	$data  = base64_decode($_COOKIE['WebChessData']);
	$ident = substr($data,0,32);
	$token = substr($data,32);
	$query = "
		SELECT *
		FROM ".T_PLAYER."
		WHERE p_ident = '{$ident}'
			AND p_token = '{$token}'
	";
	call($data);call($ident);call($token);call($query);

	if ($player = $mysql->fetch_assoc($query, __LINE__, __FILE__))
	{
		call('COOKIE OK !');
		$refreshPlayer = true;

		// regenerate the security info
		session_regenerate_id(true);
		$ident = md5(uniqid(mt_rand( ), true));
		$token = md5(uniqid(mt_rand( ), true));
		$data  = base64_encode($ident . $token);
		setcookie('WebChessData', $data, time( ) + (60 * 60 * 24 * 360));//Cookies pour 360 jours.

		// save the new ident and token to the database - enregistrer le nouvel identifiant et mot codé dans la base de données.
		$query = "
			UPDATE ".T_PLAYER."
			SET p_ident = '{$ident}'
				, p_token = '{$token}'
			WHERE p_id = '{$player['p_id']}'
		";
		$mysql->query($query, __LINE__, __FILE__);
	}
	else // cookie data is invalid
	{
		call('COOKIE INVALID !');
		session_unset( ); // delete any session vars
		setcookie('WebChessData','DELETED!',time( ) - 3600); // delete the cookie
		header('Location: login.php'); // redirect to the login page
		exit;
	}
}
// if somebody is trying to log in - si quelqu'un essaie de se connecter
elseif (isset($_POST['token']))
{
	call('REGULAR LOGIN');

	// test the token - Teste le mot codé.
	if (( ! isset($_SESSION['token'])) || ($_SESSION['token'] != $_POST['token']))
	{
		call($GLOBALS);
		die('Erreure détectée.<br /><br />Si vous avez atteint cette page par erreur, veuillez revenir à la page de connexion, effacer votre cache, actualiser la page et essayer de vous reconnecter.');
	}

	// check for a player with supplied username and password - Sélectionne un joueur avec le nom d'utilisateur et le mot de passe fournis.
	$query = "
		SELECT *
		FROM ".T_PLAYER."
		WHERE p_username = '".sani($_POST['txtUsername'])."'
	";
	$player = $mysql->fetch_assoc($query, __LINE__, __FILE__);

	// check for an old password and update if needed - Vérifie un ancien mot de passe et le met à jour si nécessaire.
	if ((false !== $player) && (32 === strlen($player['p_password']))) {
		if (md5($_POST['pwdPassword']) === $player['p_password']) {
			$player['p_password'] = password_make($_POST['pwdPassword']);
			$mysql->insert(T_PLAYER, array('p_password' => $player['p_password']), " WHERE `p_id` = '{$player['p_id']}' ");
		}
	}
}
else // we need to log in - nous devons nous connecter
{
	call('NO LOGIN DETECTED');
	call($GLOBALS);
	header('Location: login.php');
	exit;
}

// just refresh, OR log us in if such a player exists and password is good... otherwise die - Il suffit de rafraîchir OU de nous connecter si un tel joueur existe et que le mot de passe est bon ... sinon disparaissez.
if (isset($refreshPlayer) || ((false !== $player) && password_test($_POST['pwdPassword'], $player['p_password'])))
{
	$_SESSION['GAME'] = 'WebChess2-'.$CFG_SITENAME.'-'.$CFG_MAINPAGE; // prevent cross script session stealing due to refresh login
	$_SESSION['player_id'] = $player['p_id'];
	/*echo $_SESSION['player_id'] ;
	exit('Stop');*/
	$_SESSION['wins'] = $player['p_wins'];
	$_SESSION['draws'] = $player['p_draws'];
	$_SESSION['losses'] = $player['p_losses'];
	$_SESSION['rating'] = $player['p_rating'];
	$_SESSION['nb_games'] = $player['p_wins']+$player['p_draws']+$player['p_losses'];
	$_SESSION['last_input_time'] = time( );
	$_SESSION['first_name'] = $player['p_first_name'];
	$_SESSION['last_name'] = $player['p_last_name'];
	$_SESSION['username'] = $player['p_username'];
	$_SESSION['email'] = $player['p_email'];
	$_SESSION['pref_history'] = $player['p_history'];
	$_SESSION['pref_theme'] = $player['p_theme'];
	$_SESSION['pref_auto_reload'] = $player['p_auto_reload'];
	$_SESSION['pref_max_games'] = $player['p_max_games'];
	$_SESSION['pref_show_last_move'] = ( "1" == $player['p_show_last_move'] ) ? true : false;
	$_SESSION['is_admin'] = ( $CFG_ROOT_ADMIN == $player['p_username'] || "1" == $player['p_is_admin'] ) ? true : false;
	
//MEDAILLES DANS LOGIN.IN.PHP POUR LA PARTIE ESPACE PERSO ET CHESSUTILS.INC.PHP 
	//POUR LE RESTE

		// pseudo + médailles
	$_SESSION['username_medal'] =  "";
		//médailles pour le nombre de parties
	$_SESSION['medal'] = "";

	if($_SESSION['nb_games'] < 10){
		$_SESSION['username_medal'] = $player['p_username'];
		$_SESSION['medal'] = '';
	}
	if($_SESSION['nb_games'] >= 10 && $_SESSION['nb_games'] < 49){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_1.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_1.png" />';
	}
	else if($_SESSION['nb_games'] >= 50 && $_SESSION['nb_games'] < 99){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_2.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_2.png" />';
	}
	else  if($_SESSION['nb_games'] >= 100 && $_SESSION['nb_games'] < 149){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_3.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_3.png" />';
	}
	else  if($_SESSION['nb_games'] >= 150 && $_SESSION['nb_games'] < 199){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_4.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_4.png" />';
	}
	else  if($_SESSION['nb_games'] >= 200 && $_SESSION['nb_games'] < 249){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_5.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_5.png" />';
	}
	else  if($_SESSION['nb_games'] >= 250 && $_SESSION['nb_games'] < 299){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_6.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_6.png" />';
	}
	else  if($_SESSION['nb_games'] >= 300 && $_SESSION['nb_games'] < 349){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_7.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_7.png" />';
	}
	else  if($_SESSION['nb_games'] >= 350 && $_SESSION['nb_games'] < 399){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_8.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_8.png" />';
	}
	else  if($_SESSION['nb_games'] >= 400 && $_SESSION['nb_games'] < 499){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_9.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_9.png" />';
	}
	else  if($_SESSION['nb_games'] >= 500 && $_SESSION['nb_games'] < 599){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_10.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_10.png" />';
	}
	else  if($_SESSION['nb_games'] >= 600 && $_SESSION['nb_games'] < 799){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_11.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_11.png" />';
	}
	else if($_SESSION['nb_games'] >= 800 && $_SESSION['nb_games'] < 999){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_12.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_12.png" />';
	}
	else if($_SESSION['nb_games'] >= 1000){
		$_SESSION['username_medal'] = $player['p_username'].'<img src="rec_img/rec_13.png" />';
		$_SESSION['medal'] = '<img src="rec_img/rec_13.png" />';
	}

	if($_SESSION['wins'] >= 100 && $_SESSION['wins'] < 499){
		$_SESSION['username_medal'] .= '<img src="rec_img/rec2_1.png" />';
		$_SESSION['medal'] .= '<img src="rec_img/rec2_1.png" />';

	}
	else if($_SESSION['wins'] >= 500  && $_SESSION['wins'] < 1000){
		$_SESSION['username_medal'] .= '<img src="rec_img/rec2_2.png" />';
		$_SESSION['medal'] .= '<img src="rec_img/rec2_2.png" />';
	}
	else if($_SESSION['wins'] >= 1000){
		$_SESSION['username_medal'] .= '<img src="rec_img/rec2_3.png" />';
		$_SESSION['medal'] .= '<img src="rec_img/rec2_3.png" />';
	}
	
	$today = strtotime(date('Y-m-d'));
	$difference = $today - strtotime($player['p_created']);
	$diff_jours = $difference / 86400;

	$_SESSION['jours_inscrit'] = $diff_jours; 

	//inscrit depuis un an
	if($diff_jours > 364){
		$_SESSION['username_medal'] .= '<img src="rec_img/rec3_1.png" />';
		$_SESSION['medal'] .= '<img src="rec_img/rec3_1.png" />';

	}

	
	// only regenerate the security info if we are loggin in - ne régénérer que les informations de sécurité si nous nous connectons
	// if it's a refresh login, skip this step - s'il s'agit d'une connexion de rafraîchissement, ignorez cette étape
	if (isset($_POST['remember']) && ('' != $_POST['remember']))
	{
		// generate the security info - générer les informations de sécurité
		session_regenerate_id(true);
		$ident = md5(uniqid(mt_rand( ), true));
		$token = md5(uniqid(mt_rand( ), true));
		$data  = $ident . $token;
		$data  = base64_encode($data);
		setcookie('WebChessData', $data, time( ) + (60 * 60 * 24 * 7)); // 1 week
//echo $_COOKIE['WelChessData'];
		// save the new ident and token to the database - enregistrer le nouvel ident et mot codé dans la base de données.
		$query = "
			UPDATE ".T_PLAYER."
			SET p_ident = '{$ident}'
				, p_token = '{$token}'
			WHERE p_id = '{$player['p_id']}'
		";
		$mysql->query($query, __LINE__, __FILE__);
	}

	$Message = new Message($_SESSION['player_id'], $_SESSION['is_admin']);
}
else
{
	if (!DEBUG)
	{
		echo '<script type="text/javascript">alert(\'Mot de passe ou pseudo incorrect.\'); window.location.replace(\'login.php\');</script>';
	}
	else
	{
		echo 'Erreur <br />POST: ';
		call($_POST);
		echo 'Query Results: ';
		call($player);
		echo 'MySQL error: ';
		call($mysql->fetch_error( ));
	}

	exit;
}

if (!empty ($_SESSION['username']))
    $x=24;
    $_SESSION['calcul']=$x;
    header ("Refresh: 1;URL=../reception.php");
    echo $_SESSION['username'];
    exit("<br/> Stop.");

?>


A la fin de ce fichier en lignes 335 à 340, que j'ai ajouté pour faire des tests, vous retrouvez le script permettant d'envoyer des valeurs en session vers le même fichier nommé réception.php.
Mais qui cette fois ci ne sont pas transmises en transitant par un fichier nommé index.php comme l'indique c'est copie partielle d'écran utile:

La valeur Mathieu apparait durant 1 seconde, mais ensuite bien que la redirection se réalise comme prévu vers le fichier reception.php, aucune données concernant la valeur des sessions "username" et "calcul" n'est transmises à ce niveau.


Le problème pourrait il venir du fichier index.php du fait qu'il soit présent durant 1 seconde avec la valeur Mathieu.Mais sans la valeur transmise par la session "calcul" ?

Merci de bien vouloir m'apporter votre aide afin de localiser ce dysfonctionnement pour de résoudre le problème qui me préoccupe.

Cordialement.

4 réponses

lugdanum Messages postés 108 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 14 novembre 2021 40
9 juin 2019 à 17:21
Hello

je pense que c'est le comportement normal de PHP qui estime qu'il y a potentiellement la possibilité que ta redirection/passage de variable en session est dangereuse et peux provenir d'une attaque (hack...) d'un autre site...

-> Essaye en passant tes variables par GET
header ("Refresh: 1;URL=../reception.php?username=XXX");

-> Essaye avec des cookies
-> Regarde aussi du côté des url absoles -> Relatives

Bon courage

_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
Ma réponse t'a un peu aidé ? Si oui, un petit merci... Merci.
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
9 juin 2019 à 17:32
Merci,
Pas facile.
J'ai tenter avec les URL absolues et relatives.
J'ai déjà pensé aux cookies.
Mais il faut dire que le problème originale provient qu'il n'y a que sous Opera que je ne parviens pas à écrire du texte sur mon site.
Sous Firefox et google Chrome rien de changé.Mes textes sont pris en compte.
C'est ainsi que j'orientes mes recherches vers la question des sessions
afin de définir exactement pourquoi avant cela fonctionnait sous Opera et pas maintenant.
La solution GET serait dont pour moi celle du dernier recours.
Mais que je n'écarte pas tant que je n'ai apas trouvé de solutions meilleures.

Cordialement.
0
Max747 Messages postés 258 Date d'inscription vendredi 11 juillet 2014 Statut Membre Dernière intervention 11 janvier 2024
10 juin 2019 à 09:03
Hello,
en fait, restant sur mon idée consistant à rechercher le bug par la méthode de sessions ne fonctionnant pas normalement pour une raison que j'ignore encore, la redirection vers le fichier reception.php s'effectue d'abord durant 1 seconde en transitant par le fichier index.php.
Cela est dû aux scripts du fichier login.inc.php puisqu'en toute logique tout se déroule bien avec le couple envoi.php - reception.php comme présenté au début de mon sujet.
Avez vous une piste, un indice ou une idée que je puisse appliquer, par le fonctionnement des sessions si possible, pour mener l'enquête?
Comptant sur votre perspicacité, je continue mes recherches pour tenter de découvrir la raison de ce défaut.
Cordialement.
0
Hello,

Ne parvenant pas à transmettre des valeurs avec les sessions à l'aide de html.inc.php , je me suis orienté vers une solution consistant à utiliser des fonctions.

Ainsi voici le fichier simple mais fiable permettant d'appeler des fonctions dans html.inc.php et qui se nomme test.php:
<?php 
include ("html.inc.php"); 

bonjour();
echo $hello;

test();
echo $mavaleur;

?> 


Et voici la partie intéressante se trouvant à la fin du fichier html.inc.php comportant les fonctions en rapport avec test.php:
function bonjour()
{
	global $hello;
	$hello="Bonjour";
}

/*
$nom = "<p>{$_SESSION['username']}</p>";
$_SESSION['user']=$nom;
echo $_SESSION['user']; //OK  
exit("<br/> Stop.");
*/
$nom = "<p>{$_SESSION['username']}</p>";
$_SESSION['user']=$nom;
function test()
{
global $mavaleur;
$pseudo = $_SESSION['user']; //non ok
$mavaleur = $pseudo;
}

?> 


Dans cette exemple seul la valeur correspondant à la variable $hello est retournée.
La variable $mavaleur n'est pas retournée.
Alors que $_SESSION['user'] se trouvant en ligne 10 lorsque les lignes 8 à 11 sont activées retournent la valeur de la variable $_SESSION['user'] !

Quelqu' un peut il m'expliquer la raison de ce qui est pour moi anormal?

Merci.
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
Modifié le 23 févr. 2020 à 11:21
concernant le comportement que tu décris en #4:
as-tu vérifié la valeur de la variable $mavaleur dans la fonction test(), par exemple en y faisant un echo?
0
yg_be Messages postés 22730 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 26 avril 2024 1 477
23 févr. 2020 à 10:52
bonjour,
concernant le comportement que tu décris au départ, et que tu penses être une anomalie:
comme tu nous as finalement informé que tu utilisais session_set_cookie_params(),
on dirait simplement que ces deux pages n'utilisent pas les même sessions.
(https://jeuxechecs.fr/echecs/login.php et https://jeuxechecs.fr/reception.php)

as-tu examiné les cookies de sessions de ces deux pages? je pense que tu y constateras l'effet de session_set_cookie_params().
0