Page 1 sur 1

Sessions ... où sont elles ?

Posté : 13 août 2005, 19:05
par Yunha
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 ...

Posté : 13 août 2005, 19:15
par Cyrano
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'];

Posté : 13 août 2005, 20:01
par Yunha
$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']'

Posté : 13 août 2005, 20:17
par Cyrano
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

Posté : 13 août 2005, 21:24
par Yunha
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:

Posté : 13 août 2005, 21:27
par Cyrano
Les messages d'erreur sns la ligne de code correspondant, ça aide pas beaucoup pour débugguer :-k

Posté : 13 août 2005, 23:51
par Yunha
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à. :?

Posté : 14 août 2005, 03:00
par Xenon_54
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.

Posté : 14 août 2005, 10:22
par Cyrano
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.

Posté : 14 août 2005, 10:29
par HD
LIMIT 0,1") 
ca c'est nouveau pour moi ! ca sert à quoi ?

Posté : 14 août 2005, 10:35
par Cyrano
Ç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.