Aide pour un formulaire

Kartio
Invité n'ayant pas de compte PHPfrance

08 août 2011, 12:38

Bonjour,
J'ai un formulaire d'authentification devant moi, je voudrais savoir si y avait une quelconque faille dessus :)
Voici le code :

Code : Tout sélectionner

<?php session_start(); // Récupération des données $login = (isset($_POST["login"])) ? $_POST["login"] : ""; $pass = (isset($_POST["pass"])) ? $_POST["pass"] : ""; $autologin = (isset($_POST["autologin"])) ? 1 : 0; $login_cookie = (isset($_COOKIE["login"])) ? $_COOKIE["login"] : ""; $pass_cookie = (isset($_COOKIE["pass"])) ? $_COOKIE["pass"] : ""; // Si des données ont été postées on les traite if (!empty($login) && !empty($pass)) { // Sécurise le login fourni, que magic_quotes_gpc soit sur on ou off if( !get_magic_quotes_gpc() ) { $login = addslashes($login); } require_once("./db.php"); $db = mysql_connect($serveur, $user, $password) or die('Erreur de connexion'); mysql_select_db($basename,$db) or die('Base inexistante'); /* On construit et on exécute la requête SQL qui regarde si le login demandé existe, et si tel est le cas rappatrie le password associé */ $sql = "SELECT password FROM tadmin WHERE pseudo='".$login."'"; $req = mysql_query($sql) or die($sql."<br />".mysql_error()); // Si le login n'existe pas dans la base, on envoie sur une page d'erreur if (mysql_num_rows($req) == 0) { header("Location: ./erreur_login.htm"); mysql_close(); return; } else { $rep = mysql_fetch_array($req, MYSQL_ASSOC); } // Sinon on compare le pass fourni avec celui de la base if (md5($pass) != $rep["password"]) { // Si le pass est mauvais, on redirige vers une page d'erreur header("Location: ./erreur_pass.htm"); mysql_close(); return; } else { /* Si tout est bon, on autorise l'accès en forgeant éventuellement un cookie afin de permettre la connexion automatique si l'utilisateur l'a demandé */ if ($autologin == 1) { $login = urlencode($login); $pass = md5($pass); setcookie("login", $login, time()+60*60*24*30); setcookie("pass", $pass, time()+60*60*24*30); } $_SESSION["membre"] = 1; header("Location: ./membres/index.php"); return; } mysql_close(); } elseif (!empty($login_cookie) && !empty($pass_cookie)) // Sinon on regarde si les cookies d'authentification sont présents { // Sécurise le login fourni, que magic_quotes_gpc soit sur on ou off if( !get_magic_quotes_gpc() ) { $login = addslashes($login_cookie); } else { $login = $login_cookie; } /* On décode le cookie correspondant au login (pas besoin pour le pass qui est en md5) */ $login = urldecode($login); $pass = $pass_cookie; require_once("./db.php"); $db = mysql_connect($serveur, $user, $password) or die('Erreur de connexion'); mysql_select_db($basename,$db) or die('Base inexistante'); /* On construit et on exécute la requête SQL qui regarde si le login demandé existe, et si tel est le cas rappatrie le password associé */ $sql = "SELECT password FROM tadmin WHERE pseudo='".$login."'"; $req = mysql_query($sql) or die($sql."<br />".mysql_error()); // Si le login n'existe pas dans la base, on envoie sur une page d'erreur if (mysql_num_rows($req) == 0) { header("Location: ./erreur_login.htm"); mysql_close(); return; } else { $rep = mysql_fetch_array($req, MYSQL_ASSOC); } // Sinon on compare le pass fourni avec celui de la base if ($pass != $rep["password"]) { // Si le pass est mauvais, on redirige vers une page d'erreur header("Location: ./erreur_pass.htm"); mysql_close(); return; } else { // Si tout est bon, on autorise l'accès $_SESSION["membre"] = 1; header("Location: ./membres/index.php"); return; } mysql_close(); } else // Sinon on affiche le formulaire d'authentification { ?> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>Authentification</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <script type="text/javascript"> function verif_form() { if (document.forms.identification.login.value == '') { alert("Veuillez rentrer votre login."); return(false); } else if (document.forms.identification.pass.value == '') { alert("Veuillez rentrer votre mot de passe."); return(false); } else { return(true); } } </script> <noscript> <meta http-equiv="Refresh" content="0; URL=http://mysite.com/noscript.htm"; ?>"/> </noscript> </head> <body bgcolor="#3377FF"> <div align="left" style="position:absolute "> <a href="http://www.newbiecontest.org"><img src="logo.png" border="" /></a> </div> <br /> <br /> <br /> <br /> <table width="75%" cellpadding="4" cellspacing="1" border="1" align="center"> <tr> <td class="row1"><table border="0" cellpadding="3" cellspacing="1" width="100%"> <tr> <td colspan="2" align="center"> <br /> <div align='center'> <b><font face="Verdana" size="3" color="#770000"><u>Acc&egrave;s &agrave; l'espace membre</u></font></b> <br /> <br /> <br /> <form name="identification" action="index.php" method="post" onSubmit="return verif_form()"> Login<br /> <input type="text" name="login" size="16"><br /><br /> Mot de passe<br /> <input type="text" name="pass" size="16"><br /><br /> Connexion automatique <input name="autologin" type="checkbox" value="1"><br /><br /><br /> <input type="submit" value="Connexion"> </form> </div> <br /> </td> </tr> </td> </tr> </table> </body> </html> <?php } ?>


Merci d'avance :P

Kartio
Invité n'ayant pas de compte PHPfrance

08 août 2011, 14:00

Un ptit up svp :lol:

ViPHP
ViPHP | 2577 Messages

08 août 2011, 14:32

Bonjour,

Je suppose que si personne ne répond, c'est que personne n'a rien vu.

Pour ma part, je regrette que tu n'utilises pas mysql_real_escape_string() pour sécuriser les requêtes SQL.
En général, on met le même message pour un utilisateur inconnu et un mot de passe erroné pour empêcher une recherche en 2 temps du user puis du mot de passe.

Kartio
Invité n'ayant pas de compte PHPfrance

08 août 2011, 14:34

Mais avec ce code source y a t-il une certaine faille? quelque part ? :D

ViPHP
ViPHP | 2577 Messages

08 août 2011, 15:02

Je ne maitrise pas get_magic_quotes_gpc() et addslashes(), c'est pour ca que je préfère mysql_real_escape_string() qui évite bien les problèmes de modification d'ordre SQL via la saisie.

Je n'ai rien vu d'autre qui me semblait pouvoir poser problème.

Mammouth du PHP | 19672 Messages

08 août 2011, 15:12

Attention avec get_magic_quotes_gpc, cette fonction va disparaitre de PHP à partir de la version 5.4, donc pour la pérennité du code, il est prudent de trouver une alternative. L'utilisation de PDO serait, à cet égard, plus approprié et rendrait en outre le code plus facile à porter vers un autre SGBD si besoin est..
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Kartio
Invité n'ayant pas de compte PHPfrance

08 août 2011, 15:18

Y aurait pas une faille cookie?