Page 1 sur 1

Verifier un login et password [php/mysql]

Posté : 08 déc. 2006, 04:22
par elno
Bonjour à tous,

Je débute en php et j'essaye d'adapter un code permettant de créer une page de login, pour l'enregistrement des utilisateurs pas de problême, la page fonctionne bien et les infos sont correctement enregistrées dans la base de donnée par contre lorsque j'essaye de vérifier l'existence et la validité du password ca ne fonctionne pas.

Voici mon code:
Le formulaire d'enregistrement est sur la page: login.php qui appelle la page member.php une fois le formulaire posté.
Voici mon formulaire d'enregistrement:
<a href="register_form.php">Not a member?</a>
<form method=post action="member.php">
<table bgcolor=#cccccc>
      <tr>
            <td>Username:</td>
            <td><input type=text name=username></td>
      </tr>
      <tr>
            <td>Password:</td>
            <td><input type=password name=passwd></td></tr>
      <tr>
            <td colspan=2 align=center>
            <input type=submit value="Log in"></td>
      </tr>
</table>
</form>
Le code de validation de l'utilisateur est sur cette page, member.php
	if(!$_POST['username'] | !$_POST['passwd']) 
		{
	        do_html_header();
		echo'<h3>Sorry</h3>You did not fill in a required field.';
		die();
		}
	if (!get_magic_quotes_gpc()) 
		{
		$_POST['username'] = addslashes($_POST['username']);
		}
$user_check = $db_object->query("SELECT username FROM user WHERE username = '".$_POST['username']."'");
	if (DB::isError($user_check) || $user_check->numRows() == 0) 
		{
	        do_html_header();
		echo'<h3>Sorry</h3>That username does not exist in our database.';
		die();
		}

$info = $user_check->fetchRow();
$_POST['passwd'] = stripslashes($_POST['passwd']);
$info['passwd'] = stripslashes($info['passwd']);
$_POST['passwd'] = md5($_POST['passwd']);

	if ($_POST['passwd'] != $info['passwd']) 
		{
	        do_html_header();
		echo'<h3>Sorry</h3>Incorrect password, please try again.';
		die();
		}

$_POST['username'] = stripslashes($_POST['username']);
$_SESSION['username'] = $_POST['username'];
$_SESSION['password'] = $_POST['passwd'];
$db_object->disconnect();
echo'Welcome'.$_POST['username'];
A ce point la verif de la premiere condition marche nickel, la verification de l'existence du username dans la base de donnée aussi.

C'est sur le control du password que je seche, ici la verification est toujours négative.
J'ai essayé de changer le control du password en utilisant un code similaire à celui du controle du username:
$_POST['passwd'] = stripslashes($_POST['passwd']);
$_POST['passwd'] = md5($_POST['passwd']);

$pass_check = $db_object->query("SELECT passwd FROM user WHERE passwd = '".$_POST['passwd']."'");
	if (DB::isError($pass_check) || $pass_check->numRows() == 0) 
		{
	        do_html_header();
		echo'<h3>Sorry</h3>Incorrect password, please try again.';
		die();
		}
Mais rien à faire, je ne vois pas ou est mon erreur.
Merci d'avance pour votre aide.

Posté : 08 déc. 2006, 04:38
par Ajoloca
Bonsoir,

Je pense que tu te compliques la vie.
Tu peux le faire en une seule requête qui te retourne un nombre, si ce nombre == 0 =>pas inscrit.
$qry = "SELECT COUNT(*) AS existe FROM user WHERE username = '".$_POST['username']."' AND passwd = '" . md5($_POST['passwd'] . "'");
Si existe == 0, il n'est pas reconnu.

Posté : 08 déc. 2006, 04:49
par elno
Je précise ce que je comprends de ce code,
une fois que le username est validé , je crée la variable $info qui se réfère à la rangée suivante de ma table , cette rangée s'intitule passwd et stocke les mots de passe.
Ensuite je supprime les anti-slashes de la variable $_POST['passwd'] et j'effectue la même opération sur la variable $info correspondant au password crypté par md5 présent dans la table.
Finalement je crypte la variable $_POST['passwd'] avec md5 pour la comparer avec $info.

Si la comparaison est fausse j'ai le message "Incorrect password", sinon le password est validé et le message "Welcome username" est affiché.

Ai-je bien compris le fonctionnement du code?

Re-merci d'avance

Posté : 08 déc. 2006, 05:20
par elno
Merci pour ta rapidité Ajoloca

J'ai essayé ton code de cette facon:
$connect = mysql_connect("localhost", "bm_user", "password") or die(mysql_error());
mysql_select_db('bookmarks', $connect) or die(mysql_error());

$qry = "SELECT COUNT(*) AS existe FROM user WHERE username = '".$_POST['username']."' AND passwd = '" . md5($_POST['passwd'] . "'");

   $result = mysql_query($qry,$connect);
   if(!$result || (mysql_numrows($result) < 1))
{
	        do_html_header();
		echo'<h3>Sorry</h3>Username or Password does not exist.';
		die();
}
  else
{
	        do_html_header();
		echo'<h3>Welcome</h3>'.$_POST['username'];
		die();
}

Le resultat est toujours negatif , est ce que de cette manière mon code envoie bien la requête à la base de donnée?

Et pour le fait de me compliquer la vie c'est tout as fait possible mais ca me permet de détailler chaque partie du code et du coup peut être de mieux comprendre qu'est ce qui fait quoi...
Un jour peut être mes connaissances me permettront d'aller droit au but , en attendant je rame mais ne perds pas l'espoir :)

Posté : 08 déc. 2006, 14:11
par Ajoloca
Bonjour,

Je crois que tu devrais procéder de manière inverse,
commencer par le plus simple (plus facile à comprendre)
et augmenter en complexité à mesure que tes compétences augmentent.

La proposition que je t'ai faite, dans l'état ne détaille pas l'erreur (itilisateur)
elle te permets simplement de savoir si le couple utilisateur - mot de passe existent dans ta base
(en réalité c'est ce qui t'interesse).

De plus je pense qu ta procédure contient une erreur de conception.
Tu selectionnes un utilisateur (ok) ensuite tu selectionnes un mot de passe,
qui te dit que l'utilisateur à saisi son mot de passe.
Il aurait tres bien choisr celui d'un autre que ta procédure fonctionnearait,
tu ne demandes que que ce mot de passe existe dans ta base.

La requête (que je t'ai proposé).
On ne va pas compter le nombre de rangs (mysql_num_rows()) mais voir le contenu de "existe", si "existe" vaut 0 c'est que ce couple (utilisateur-mot de passe) n'exitent pas dans la base.

Je suppose que dans ta base le mot de passe est haché par md5() comme ton code le laisse penser.
<?php
// Récupération des variables passées en POST

$webUser = isset($_POST['username']) ? $_POST['username'] : '';
$webUserPass = isset($_POST['passwd']) ? md5($_POST['passwd'] : '';

 // Test sur la validité des valeurs
if (empty($webUser) || empty ($webUserPass)){
   // Utilisateur ou mot de passe vide
   exit();
}
$host = 'nom_serveur';
$user = 'MySQL_user';
$passWd = 'password';
$dbName = 'nom_base';
// Connexion au serveur
mysql_connect($host, $user, $passWd) or die ('Connexion au serveur ' .$host . ' Impossible<br />' . mysql_error());

// Sélection de la base de données
mysql_select_db($dbName) or die ('S&eacute;lection de la base impossible<br />' . mysql_error());



// Construction de la requête
$qry = $qry = "SELECT COUNT(*) AS existe FROM user WHERE username = '". $webUser ."' AND passwd = '" . $webUserPass . "'");

// Exécution de la requête
$result = mysql_query($qry) or die('ERR_SQL : ' . $qry . '<br />' . mysql_error());
if(! mysql_result($result, 0, 'existe')) {
   do_html_header(); 
   die('<h3>Sorry</h3>Username or Password does not exist.');
}
do_html_header();
echo'<h3>Welcome </h3>'.$webUser;
?>

Posté : 08 déc. 2006, 14:51
par elno
Salut Ajoloca

Bon voila j'ai cherché un peu et finalement ce code fonctionne bien:
	if(!$_POST['username'] | !$_POST['passwd']) 
		{
	        do_html_header();
		echo'<h3>Sorry</h3>You did not fill in a required field.';
		die();
		}
	if (!get_magic_quotes_gpc()) 
		{
		$_POST['username'] = addslashes($_POST['username']);
		}
$user_check = $db_object->query("SELECT username FROM user WHERE username = '".$_POST['username']."'");
	if (DB::isError($user_check) || $user_check->numRows() == 0) 
		{
	        do_html_header();
		echo'<h3>Sorry</h3>That username does not exist in our database.';
		die();
		}
$pass_check = $db_object->query("SELECT passwd FROM user WHERE passwd = '".md5($_POST['passwd'])."'");
	if (DB::isError($pass_check) || $pass_check->numRows() == 0) 
		{
	        do_html_header();
		echo'<h3>Sorry</h3>Incorrect password, please try again.';
		die();
		}

$_POST['username'] = stripslashes($_POST['username']);
$_SESSION['username'] = $_POST['username'];
$_SESSION['password'] = $_POST['passwd'];
$db_object->disconnect();

echo'Welcome '.$_SESSION['username'];
En revanche comme tu me la précisé plus haut il y a en effet un pb de conception et je peux logger un utilisateur en utilisant le password d'un autre utilisateur.

Je vais tester et étudier ton code, et voir ensuite si je peut corriger l'erreur sur le code ci-dessus.

Merci pour ton aide

Posté : 08 déc. 2006, 14:57
par Ajoloca
Re,

Si tu tiens à utiliser ton code, pour corriger cette erreur
modifie juste ta seconde requête comme ceci
$pass_check = $db_object->query("SELECT passwd FROM user WHERE username = '".$_POST['username']."' AND passwd = '".md5($_POST['passwd'])."'"); 

Posté : 08 déc. 2006, 15:13
par elno
J'y avais deja pensé mais j'avais dut faire une erreur de syntax dans la requête.
ton code fonctionne nickel! merci.

Pour le code que tu m'as proposé c'est pareil tout fonctionne très bien,

Merci encore pour ton aide.