[PHP] script de login

script de login [PHP] - PHP - Programmation

Marsh Posté le 09-02-2006 à 19:54:37    

echo 'Salut tout le monde,
Pour mon site, je dois écrire une page d'identification avec 2 champs : pseudo et mot de passe! Les pseudos et mots de passse sont stockés dans une base de donnée. Et je voudrais que quand le pseudos et le mot de passe sont bons,
il y est un lien vers une page qui soit spécifique à chaque utilisateur (pour ça j'utilise un champs url dans ma base de donnée)';
1) le formulaire:

Code :
  1. <div align="left"><h3>s'identifier :</h3></div><br>
  2. <form method="post" action="/inc/files/login.php">
  3. <div align="left"><h3>pseudo : </h3></div><div align="right"><input type="text" name="pseudo"></div><br>
  4. <div align="left"><h3>mot de passe : </h3></div><div align="right"><input type="password" name="motdepasse">
  5. <input type="submit" value="Valider"></div>
  6. </form>


2) le traitement du formulaire :  

Code :
  1. <?php
  2. $pseudo=$_POST['pseudo'];
  3. $motdepasse=$_POST['motdepasse'];
  4. require ($_SERVER['DOCUMENT_ROOT'].'/inc/bd.inc.php');
  5. if($pseudo = "" OR $motdepasse = "" ) {
  6.     echo "Attention, au moins un des champs n'a pas été rempli!";
  7. } else{
  8.     $db = mysql_connect( $bdserveur, $bdutilisateur, $bdpass);
  9.     mysql_select_db( $bdbase,$db);
  10.     $sql = "SELECT url FROM users WHERE pseudo='$pseudo' AND motdepasse='$motdepasse'";
  11.     $req = mysql_query($sql) or die('Pseudo ou mot de passe erroné!<br><a href="../login.inc.php">retour</a>');
  12.     echo 'Salut '.$pseudo.', tu as bien été identifié!<br><a href="'.$req.'/admin.php">continuer</a>';
  13. }
  14. ?>


a chaque fois j'obtient "Pseudo ou mot de passe erroné! retour! ", quelqu'un peut t'il m'aider?


Message édité par hugoOo le 09-02-2006 à 20:13:00
Reply

Marsh Posté le 09-02-2006 à 19:54:37   

Reply

Marsh Posté le 09-02-2006 à 20:04:56    

moi, j'utilise ça , si tu veux t'en inspirer.
 

Code :
  1. <?
  2. require("connect2bdd.php" ) ;
  3. connect2bdd();
  4. $name1=$_POST["name1"];
  5. $pass1=$_POST["pass1"];
  6. $ress = mysql_query("SELECT * FROM webmasters WHERE name='$name1' and pass='$pass1' " ) or die("erreur de requette 1 " ); 
  7. $existe=mysql_numrows($ress); 
  8. if(!$existe){
  9. echo "<center>Veuillez vérifier vos données</center>";
  10. include("f_log.php" );
  11. }else{
  12. session_start(); 
  13. session_register("name" );
  14. $query ="UPDATE webmasters SET ";
  15. $query.="visite=visite + 1 , ";
  16. $query.="lastlog='" . date("Y-m-d H:i:s" ) . "' ";
  17. $query.="WHERE name='$name1'" ; 
  18.              $result = mysql_query($query);
  19. $_SESSION["name"]=session_name();
  20. $_SESSION["sess_id"]=session_id();
  21. $_SESSION["login"]=$name1;
  22. Header("Location: Sommaire.php" );
  23. }
  24. ?>


 :hello:

Reply

Marsh Posté le 09-02-2006 à 20:17:23    

oui merci ça ma aidé à corrigé une erreur mais ce n'est pas vraiment ce que je cherche à faire! je pense que l'erreur vient de

Citation :

$sql = "SELECT url FROM users WHERE pseudo='$pseudo' AND motdepasse='$motdepasse'";

je ne sais pas bien ou mettre des ' et des ", quelqu'un pour m'aider ? :hello:

Reply

Marsh Posté le 09-02-2006 à 21:09:09    

Ca ne serait pas plutôt cela :

Code :
  1. $sql = "SELECT url FROM users WHERE pseudo='".$pseudo."' AND motdepasse='".$motdepasse."'";


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 09-02-2006 à 22:49:17    

ça sent la futur faille php, genre SQL injection. Même pas de vérif au niveau des variable ni même un petit addslashes()..
C'est pourtant un classique le login...
 
http://www.haypocalc.com/wiki/Inje [...] t_de_passe
 

Reply

Marsh Posté le 10-02-2006 à 08:41:11    

En sécurisant :
 

Code :
  1. $pseudo=mysql_real_escape_string($pseudo);
  2. $motdepasse=mysql_real_escape_string($motdepasse);
  3. $sql = "SELECT url FROM users WHERE pseudo='".$pseudo."' AND motdepasse='".$motdepasse."'";


 
Est-ce suffisant pour éviter le SQLinjection ?


---------------
Proverbe chinois: il vaut mieux apprendre à pêcher à un mendiant que de lui donner du poisson...
Reply

Marsh Posté le 10-02-2006 à 09:58:04    

déjà plus sympa.
2ème chose, pour le motdepasse il serait plus sage de mettre son HASH genre MD5 dans la base. Non seulement ca évite d'avoir les pass écrit en clair (pratique si hack sur la base) et ça garantis (un minium) pour les utilisateurs que l'on va pas "piquer" leur passe. (Sachant qu'en règle général, la majorité des utilisateurs se serve du même pass pour tous leurs comptes...)

Reply

Marsh Posté le 10-02-2006 à 10:32:57    

Code :
  1. if($pseudo = "" OR $motdepasse = "" ) {


il te faudrait pas plustot ecrire :

Code :
  1. if($pseudo == "" OR $motdepasse == "" ) {


 
?


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 10-02-2006 à 11:15:26    

odo91600 a écrit :

moi, j'utilise ça , si tu veux t'en inspirer.
 

Code :
  1. <?
  2. require("connect2bdd.php" ) ;
  3. connect2bdd();
  4. $name1=$_POST["name1"];
  5. $pass1=$_POST["pass1"];
  6. $ress = mysql_query("SELECT * FROM webmasters WHERE name='$name1' and pass='$pass1' " ) or die("erreur de requette 1 " ); 
  7. $existe=mysql_numrows($ress); 
  8. if(!$existe){
  9. echo "<center>Veuillez vérifier vos données</center>";
  10. include("f_log.php" );
  11. }else{
  12. session_start(); 
  13. session_register("name" );
  14. $query ="UPDATE webmasters SET ";
  15. $query.="visite=visite + 1 , ";
  16. $query.="lastlog='" . date("Y-m-d H:i:s" ) . "' ";
  17. $query.="WHERE name='$name1'" ; 
  18.              $result = mysql_query($query);
  19. $_SESSION["name"]=session_name();
  20. $_SESSION["sess_id"]=session_id();
  21. $_SESSION["login"]=$name1;
  22. Header("Location: Sommaire.php" );
  23. }
  24. ?>


 :hello:


 
Script dangereux. Aucune protection du post. On peut y faire de l'injection SQL comme on veut. Les mots de passe ne doivent pas etre en clair dans la base ;).


---------------
MZP est de retour
Reply

Marsh Posté le 10-02-2006 à 13:08:33    

ah ?
comment securisé ça alors ?

Reply

Marsh Posté le 10-02-2006 à 13:08:33   

Reply

Marsh Posté le 10-02-2006 à 13:27:00    

euh tu as un lien donné juste au dessus.


---------------
MZP est de retour
Reply

Marsh Posté le 10-02-2006 à 15:00:27    

oups (avé pas vu)
merci beaucoup pour le conseil  :jap:


Message édité par odo91600 le 10-02-2006 à 15:00:55
Reply

Marsh Posté le 10-02-2006 à 20:56:49    

merci tout le monde de vos réponses mais j'ai pas vrément compris ce que je dois ajouter à mon script pour le sécurisé? :

Code :
  1. <?php
  2. $pseudo=$_POST['pseudo'];
  3. $motdepasse=$_POST['motdepasse'];
  4. require ($_SERVER['DOCUMENT_ROOT'].'/inc/bd.inc.php');
  5. if($pseudo == "" OR $motdepasse == "" ) {
  6.     echo "Attention, au moins un des champs n'a pas été rempli!";
  7. } else{
  8.     $db = mysql_connect( $bdserveur, $bdutilisateur, $bdpass);
  9.     mysql_select_db( $bdbase,$db);
  10.     $sql = "SELECT url FROM users WHERE pseudo='".$pseudo."' AND motdepasse='".$motdepasse."'";
  11.     $req = mysql_query($sql) or die('Pseudo ou mot de passe erroné!<br><a href="../login.inc.php">retour</a>');
  12.     echo 'Salut '.$pseudo.', tu as bien été identifié!<br><a href="'.$req.'/admin.php">continuer</a>';
  13. }
  14. ?>


Message édité par hugoOo le 10-02-2006 à 21:11:14
Reply

Marsh Posté le 12-02-2006 à 18:27:09    

Hello,
prennons un exemple :
$motdepasse = "' or '1'='1";
ta requete sql deviendrait :
$sql = "SELECT url FROM users WHERE pseudo='".$pseudo."' AND motdepasse='' or '1'='1'";
=> hop le malfaiteur peut se logguer avec n'importe quel login.
 
Pour securiser tout ça, il faut echapper les valeurs rentrées par l'utilisateur (addslashes, mysql_escapestring, ...)


---------------
http://poemes.iceteapeche.com - http://www.simuland.net
Reply

Marsh Posté le 13-02-2006 à 11:16:44    

j'ai refait mon script, sa marche :  

Code :
  1. <?php
  2. $pseudo=$_POST['pseudo'];
  3. $motdepasse=$_POST['motdepasse'];
  4. require ($_SERVER['DOCUMENT_ROOT'].'/inc/bd.inc.php');
  5. if($pseudo == "" OR $motdepasse == "" ) {
  6.     echo "Attention, au moins un des champs n'a pas été rempli!<br><a href=\"../../essai.php\">retour</a>";
  7. } else{
  8.     $db = mysql_connect( $bdserveur, $bdutilisateur, $bdpass);
  9.     mysql_select_db( $bdbase,$db);
  10.     $sql = "SELECT * FROM users WHERE pseudo='".$pseudo."' AND motdepasse='".$motdepasse."'";
  11.     $result = mysql_query($sql, $db);
  12.     $nbr = mysql_num_rows($result);
  13.      if($nbr == 1) {
  14.       echo 'Salut '.$pseudo.', tu as bien été identifié!<br><a href="../../'.$pseudo.'/admin.php">Continuer!</a>';
  15.       $_SESSION['username'] = $pseudo;
  16.      } else{
  17.       echo 'Pseudo ou mot de passe incorrect!<br><a href="'.$_SERVER['DOCUMENT_ROOT'].'index.php">retour</a>';
  18.      }
  19. }
  20. ?>


par contre je n'ai pas bien compris ou je dois utiliser addslashes ou mysql_escapestring
quelqu'un peut t'il m'aider?

Reply

Marsh Posté le 13-02-2006 à 11:21:03    

A chaque fois que tu utilises une variable qui peut provenir de l'utilisateur dans une requête.
 
http://fr3.php.net/mysql_real_escape_string


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 14-02-2006 à 17:32:26    

j'ai bien compris les injections sql mais je n'ai pas compris ce que fait mysql_real_escape_string, j'ai écrit sa:

Code :
  1. $pseudo=mysql_real_escape_string($pseudo);
  2. $motdepasse=mysql_real_escape_string($motdepasse);


est-ce suffisant?

Reply

Marsh Posté le 14-02-2006 à 21:19:13    

mysql_real_escape_string t'assure que tout les carctère "spéciaux" on été echappé puisque c'est sa fonction.

Reply

Marsh Posté le 14-02-2006 à 23:17:17    

et je dois ensuite passer mes variables dans addslashes() ou pas?

Reply

Marsh Posté le 14-02-2006 à 23:21:48    

Non parceque tu risque de te retrouver avec plein de \\ dans ta chaîne. il me semble que mysql_real_escape_string() est suffisant.

Reply

Marsh Posté le 14-02-2006 à 23:35:54    

oki merci de ton aide :D

Reply

Marsh Posté le 14-02-2006 à 23:57:13    

Mais je t'en prie. :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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