Sessions ... où sont elles ?

Yunha
Invité n'ayant pas de compte PHPfrance

13 août 2005, 19:05

Bonsoir, j'ai decidé de faire un espace membre pour mon site, script d'inscription reussi, mais avec la connexion ça va pas trop. Le problème c'est quand je crée des sessions, je redirige vers la page de news et comme les sessions sont vides j'ai mis exit . Mais pourtant j'ai fait session_start partout et j'ai bien crée les variables de session. Voici mon code, si vous trouvez où est le problème merci de me le communiquer :)

Après un formulaire de connexion ... (les post ne sont pas vides)
connexion.php
<? session_start;
$_SESSION['pseudo'] = $_POST['pseudo'];
$_SESSION['pass'] = $_POST['pass'];
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Connexion ...</title>
</head>

<body>
<?
if ($_SESSION['pseudo'] == "" OR $_SESSION['pass'] == "")
{ session_destroy; echo "<SCRIPT LANGUAGE=\"JavaScript\">  alert('Entrez des identifiants !');document.location.href=\"index.php\" </SCRIPT>"; }
else
{
mysql_connect("sql.free.fr","xxx","xxx"); //Connexion
mysql_select_db("membres");

$pseudo = $_SESSION['pseudo'];

$sql = mysql_query("SELECT * FROM membres WHERE login='$pseudo'") or die('erreur:' .mysql_error());
$donnees = mysql_fetch_array($sql);
  
    if (strcasecmp($_POST['pass'], $donnees['pass']) == 0)  { echo "<SCRIPT LANGUAGE=\"JavaScript\">  document.location.href=\"news.php\" </SCRIPT>"; }
    
	else
    { session_destroy; echo "<SCRIPT LANGUAGE=\"JavaScript\">  alert('Identifiants incorrects !');document.location.href=\"index.php\" </SCRIPT>"; }    
  
mysql_close();

} 
?>
</form>
</body>
</html>
news.php
<? session_start; ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<? echo "<title>Connecté en tant que : ".$_SESSION['pseudo']."</title>"; if(!isset($_SESSION['pseudo'])) { exit; } ?>
et tout le reste ...

Mammouth du PHP | 19672 Messages

13 août 2005, 19:15

Tu utilises une variable indéfinie dans ta requête:
$sql = mysql_query("SELECT * FROM membres WHERE login='$pseudo'") or die('erreur:' .mysql_error());
D'où sort $pseudo ?

Il aurait fallu soit utiliser $_SESION['pseudo'] soit faire:
$pseudo = $_POST['pseudo'];
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Yunha
Invité n'ayant pas de compte PHPfrance

13 août 2005, 20:01

$pseudo est là pour simplifier car pour
$sql = mysql_query("SELECT * FROM membres WHERE login='$pseudo'")
Il m'est impossible (enfin je sais pas comment faire) pour mettre login='$_SESSION['pseudo']' ou encore login='$_POST['pseudo']'

Mammouth du PHP | 19672 Messages

13 août 2005, 20:17

Il m'est impossible (enfin je sais pas comment faire) pour mettre login='$_SESSION['pseudo']' ou encore login='$_POST['pseudo']'
:shock: Tu me montres un truc que tu me dis que tu ne peux pas faire... en le faisant ....
Quelque chose m'échappe là :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Yunha
Invité n'ayant pas de compte PHPfrance

13 août 2005, 21:24

Il m'est impossible (enfin je sais pas comment faire) pour mettre login='$_SESSION['pseudo']' ou encore login='$_POST['pseudo']'
:shock: Tu me montres un truc que tu me dis que tu ne peux pas faire... en le faisant ....
Quelque chose m'échappe là :-k
J'ai fait comme vous avez dit et ...
Parse error: parse error, unexpected T_ENCAPSED_AND_WHITESPACE, expecting T_STRING or T_VARIABLE or T_NUM_STRING in /var/www/free.fr/e/7/kjjdm/connexion.php on line 21 :cry:

Mammouth du PHP | 19672 Messages

13 août 2005, 21:27

Les messages d'erreur sns la ligne de code correspondant, ça aide pas beaucoup pour débugguer :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Yunha
Invité n'ayant pas de compte PHPfrance

13 août 2005, 23:51

Oui, c'est quand j'ai changé login='$pseudo' en login='$_SESSION['pseudo']' comme vous l'avez dit. Donc ce que j'ai fait dans le 1er code est bon. Le problème ne vient pas de là. :?

Mammouth du PHP | 1885 Messages

14 août 2005, 03:00

La syntaxe correcte est la suivante:
$sql = mysql_query("SELECT * FROM membres WHERE login='{$_SESSION['pseudo']}'") or die('erreur:' .mysql_error());
Cependant, je me dois de t'avertir que la requête précédente n'est pas sécuritaire. En effet, il est possible de modifier la requête et d''insérer une commande malveillante.
Je te souhaite fortement de sécuriser la variable grâce à la fonction mysql_escape_string() de la manière suivante:
$pseudo = mysql_escape_string($_POST['pseudo']);
$sql = mysql_query("SELECT * FROM membres WHERE login='$pseudo'") or die('erreur:' .mysql_error());
Sécurité avant tout.

Mammouth du PHP | 19672 Messages

14 août 2005, 10:22

On pourrait faire mieux encore :
$pseudo = mysql_escape_string($_POST['pseudo']);
$sql = mysql_query("SELECT pass FROM membres WHERE login='". $pseudo ."' LIMIT 0,1") or die('erreur:' .mysql_error());
On ne fait la recherche que du mot de passe sur le pseudonyme au lieu d'un SELECT *;

Et ensuite on compare le mot de passe en limitant à la première et unique ligne de retour. Ça implique que le champ "pseudo" dans la table ne doit avoir aucun doublon.

Et au passage, on sépare proprement le SQL du PHP en faisant une concaténation propre entre la chaîne et les variables.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

HD
Mammouth du PHP | 1181 Messages

14 août 2005, 10:29

LIMIT 0,1") 
ca c'est nouveau pour moi ! ca sert à quoi ?

Mammouth du PHP | 19672 Messages

14 août 2005, 10:35

Ça veut dire que la requête s'arrêtera à la premiere ligne de résultats : le "0" est le point de départ, et "1" le nombre de lignes à retourner. MySQL en exécutant la requête va donc retourner la première ligne à partir du premier résultat obtenu, même si la requête permettrait d'avoir 25 résultats possibles sans cette clause. C'est pour ça que j'ai précisé qu'il faudrait dans ce cas un pseudo sans doublon dans la table. C'est du reste également pour ça qu'on voir sur certains sites une identification avec l'adresse de courriel au lieu du pseudonyme parce qu'une adresse de courriel sera toujours unique.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: