problème avec session_start()

problème avec session_start() - PHP - Programmation

Marsh Posté le 27-03-2008 à 20:21:42    

Salut à vous, je comprends pas, ça devrait marcher ...
Un formulaire envoie un pseudo et un pass à une page de traitement qui, si pseudo et pass corrects, initialise la session.
Voila le formulaire:
 

Code :
  1. <form action="affichage1.php" method="post">
  2. <p align="center">
  3. <label for="pseudo">Pseudo : </label>
  4. <input type="text" name="pseudo" id="pseudo" /><br>
  5. <label for="nb">Mot de passe : </label>
  6. <input type="password" name="nb" id="nb" /><br> <input type="submit" value="Valider" />
  7. </p></span>
  8. </form>


Code :
  1. <?php
  2. session_start();
  3. $pseudo = $_POST['pseudo'];
  4. $pass = $_POST['nb'];
  5. mysql_connect("truc", "machin", "chose" );
  6. mysql_select_db("bidule" );
  7. $retour = mysql_query("SELECT COUNT(*) AS nx FROM logins WHERE pseudo = $pseudo" );
  8. $donnees = mysql_fetch_array($retour);
  9. if ($donnees['nx'] == 1) // si un pseudo existe dans la bdd
  10. {
  11.     $pass2 = mysql_query("SELECT pass WHERE pseudo = $pseudo" );
  12.     if ($pass == $pass2) {
  13.         $_SESSION['mb'] = $pseudo;
  14.         $admin = mysql_query("SELECT admin WHERE pseudo = $pseudo" );
  15.         $_SESSION['admin'] = $admin;
  16.         echo $_SESSION['mb'].' '.$_SESSION['admin'];
  17.     }
  18. }
  19. else {
  20.     if($donnees['nx'] == 0) {
  21.         echo 'Pseudo incorrect';
  22.         }
  23.     if($donnees['nx'] == 1) {
  24.         echo 'pseudo existant';
  25.         $pass2 = mysql_query("SELECT pass WHERE pseudo = $pseudo" );
  26.         if(!isset($pass2)){
  27.         echo 'Mot de passe incorrect';
  28.         }
  29.     }
  30. }
  31. mysql_close();
  32. ?>


je rame dessus depuis ce matin ...
Merci d'avance !

Reply

Marsh Posté le 27-03-2008 à 20:21:42   

Reply

Marsh Posté le 27-03-2008 à 20:49:22    

quelle est l'erreur ?

Reply

Marsh Posté le 28-03-2008 à 10:31:22    

verifie la creation du fichier session, si t as les droits d ecritures dans lequel le fichier va se sauvegarder, en cas de prob tu peux specifier toi meme le repertoire dans lequel les fichiers sessions vont  s enregistrer avec session.save_path() (a appeléavant session_start() ).

Reply

Marsh Posté le 28-03-2008 à 11:20:28    

En attendant plus de renseignements sur ton erreur, 2/3 commentaires :
1- attention au malin qui va créer le pseudo "toto<script type="text/javascript">alert("i pwnz teh worldz" )</script>" ==> utiliser htmlentities
2- tu devrais stocker le hash de tes mots de passe, pas les mdps directement
3- pas sur que ce soit une bonne idée d'annoncer à qqun qu'il a un bon login et un mauvais mdp
 

Reply

Marsh Posté le 28-03-2008 à 11:48:06    

rengzehn a écrit :

3- pas sur que ce soit une bonne idée d'annoncer à qqun qu'il a un bon login et un mauvais mdp


Sur pleins de sites (genre ici), le login est affiché partout, donc je sais pas si c'est vraiment un problème (contrairement à d'autres cas)

Reply

Marsh Posté le 28-03-2008 à 11:53:48    

Citation :

1- attention au malin qui va créer le pseudo "toto<script type="text/javascript">alert("i pwnz teh worldz" )</script>" ==> utiliser htmlentities


 
La c est un script de login pas d inscription, a priori le javascript injecter ne fera rien non ?

Reply

Marsh Posté le 28-03-2008 à 12:10:12    

Sinon,
 

Citation :

"SELECT pass WHERE pseudo = $pseudo"


OUblie pas de preciser la table et de mettre des quotes a la variable php
 

Citation :

"SELECT pass FROM logins WHERE pseudo ='$pseudo'"


 
De meme pense a verifier l'input de $pseudo aui peut contenir des quotes et donc creer une possibilite d injection mysql avec
mysql_real_escape_string()
 

Reply

Marsh Posté le 28-03-2008 à 12:30:25    

Même remarques que Krifur, mais, je dois dire, les sessions c'est chiants ( ne fais aucun lien vers la page ou tu initialise les $_SESSION['xxx'] sinon, gros bug ... )d'après mon expérience !
Bonne chance

Reply

Marsh Posté le 28-03-2008 à 13:40:36    

krifur a écrit :

Citation :

1- attention au malin qui va créer le pseudo "toto<script type="text/javascript">alert("i pwnz teh worldz" )</script>" ==> utiliser htmlentities


 
La c est un script de login pas d inscription, a priori le javascript injecter ne fera rien non ?


 
oui en effet, c'est quand meme le genre de truc à blinder ici au niveau des requests sql, $pseudo n'est pas protégé.
 
$pass2 = mysql_query("SELECT pass WHERE pseudo = $pseudo" );
 
Possible d'injecter n'importe quoi dans la requete.

Reply

Marsh Posté le 28-03-2008 à 16:17:17    

J'ai modifié la ligne par  
 

Code :
  1. "SELECT pass FROM logins WHERE pseudo ='$pseudo'"


Code :
  1. verifie la creation du fichier session, si t as les droits d ecrituresdans lequel le fichier va se sauvegarder, en cas de prob tu peuxspecifier toi meme le repertoire dans lequel les fichiers sessions vont s enregistrer avec session.save_path() (a appeléavant session_start()).


Là je suis à coté de la plaque : j'ai appris le php sur Le Site du Zéro et il y a un blanc au niveau du fichier dans lequel se sauvegardent les sessions ...
Je me documente et je tiens au courant.

Reply

Marsh Posté le 28-03-2008 à 16:17:17   

Reply

Marsh Posté le 28-03-2008 à 17:06:49    

Citation :

quelle est l'erreur ?


La page affiche "pseudo incorrect".

 


Bon, voilà le code édité, mais ça ne marche toujours pas.

 
Code :
  1. <?php
  2. session_start();
  3. $pseudo = mysql_real_escape_string(htmlentities($_POST['pseudo']));
  4. $pass = md5(mysql_real_escape_string(htmlentities($_POST['nb']))); //je viens de découvrir cette fonction pour crypter les pass en md5
  5. echo $pseudo.$pass.'<br><br>';
  6. mysql_connect("truc", "machin", "chose" );
  7. mysql_select_db("bidule" );
  8. $retour = mysql_query("SELECT COUNT(*) AS nx FROM logins WHERE pseudo = '$pseudo'" );
  9. $donnees = mysql_fetch_array($retour);
  10. if ($donnees['nx'] == 1)
  11. {
  12.     $pass2 = mysql_query("SELECT pass FROM logins WHERE pseudo = '$pseudo'" );
  13.     if ($pass == $pass2) {
  14.         $_SESSION['mb'] = $pseudo;
  15.         $admin = mysql_query("SELECT admin WHERE pseudo = '$pseudo'" );
  16.         $_SESSION['admin'] = $admin;
  17.         echo $_SESSION['mb'].' '.$_SESSION['admin'];
  18. /* En fait, jusque là c'est juste pour voir si les varaibles de session sont correctement initialisées */
  19.     }
  20. }
  21. else {
  22.     if($donnees['nx'] == 0) {
  23.         echo 'Pseudo incorrect';
  24.         }
  25.     if($donnees['nx'] == 1) {
  26.         echo 'pseudo existant';
  27.         $pass2 = mysql_query("SELECT pass WHERE pseudo = '$pseudo'" );
  28.         if(!isset($pass2)){
  29.         echo 'Mot de passe incorrect';
  30.         }
  31.     }
  32. }
  33. mysql_close();
  34. ?>
 

Edit: Bon, j'ai rien trouvé sur les fichiers de session. La seule chose que j'ai apprise est que c'est le serveur qui gère tout.


Message édité par cybkiller le 28-03-2008 à 18:18:48
Reply

Marsh Posté le 28-03-2008 à 18:30:21    

Si c est juste pour tester les sessions, tu fait,

 

Dans le fichier avec le formulaire html,
$_SESSION['kikoo']="plop";

 

puis dans affichage1.php,
echo $_SESSION['kikoo'];

 
Citation :

J'ai modifié la ligne par  


C'est valable pour toutes tes requetes, t'oublies de preciser le FROM table dans plusieurs d entre elles,
Vérifie les choses une par une plutot: session puis bon traitement du processus du login(c'est pas clair tes if imbirqués la), puis hashage du mot de passe, puis verification des caracteres passer dans l input...


Message édité par krifur le 28-03-2008 à 18:35:13
Reply

Marsh Posté le 28-03-2008 à 20:14:56    

J'ai modifié toutes les lignes.
Avec des echo de toutes mes variables, j'ai localisé le pb, je suis en train de regarder.
En réalité, le $pass2 n'est pas récupéré correctement ...

Reply

Marsh Posté le 29-03-2008 à 12:40:42    

en effet mysql_query() renvoie une ressource pas une chaine de caractère, tu dois l'explode avec mysql_fetch_array(). Globalement le résultat d'une requete n'est pas une valeur mais une table.


Message édité par rengzehn le 29-03-2008 à 12:41:14
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed