Codes login

Eléphanteau du PHP | 39 Messages

25 nov. 2014, 16:42

Bonjour.

Dans un soucis de mise à jour de mes codes pour passer au PDO (Php Data Object), je voudrais savoir si ceux ci sont conforment au bon fonctionnement de ce fichier servant à loguer un utilisateur?
Notamment cette ligne que voici:
if ($login->rowCount() > 0)
Merci d'avance.
:)
<?php

session_start();

if(isset($_POST['submit']))
{


	$pseudo = htmlspecialchars(trim($_POST['pseudo']));
	$password = htmlspecialchars(trim($_POST['password']));
	
	if(empty($pseudo))
	{
		echo"Veuillez saisir votre pseudo<br/>";	
	}
	else if(empty($password))
	{
		echo"Veuillez saisir votre mot de passe";
	}
	else 
	{
	
	$bdd = new PDO('mysql:host=localhost;dbname=phpmembre', 'root', '');	
	
	$password = md5($password);
	$login = $bdd->query("SELECT * FROM users WHERE username='$pseudo' AND password='$password'");
	
	if ($login->rowCount() > 0) 
		
	{
		$_SESSION['pseudo'] = $pseudo;
		
		header('Location:membre.php');
	}
	else echo "Nom d'utilisateur ou mot de passe incorrect";
	}
}	
?>

<h1>Connexion</h1>
<form method="post" action=""> 

<p>Votre pseudo</p>
<input type="text" name="pseudo" /><br/>

<p>Votre mot de passe</p>
<input type="password" name="password" /><br/><br/>

<input type="submit" name="submit" value="Se connecter" />
</form>

<a href="register.php">Pas encore membre</a>

ynx
Mammouth du PHP | 586 Messages

25 nov. 2014, 17:19

Salut,

La doc est ton ami :) http://php.net/manual/fr/pdostatement.rowcount.php
-> retourne le nombre de lignes affectées par la dernière requête DELETE, INSERT ou UPDATE

La solution classique pour compter le nombre de résultat est d'utiliser une requête SELECT count(*), cf exemple 2 : http://php.net/manual/fr/pdostatement.r ... ample-1026

En complément, htmlspecialchars doit être utilisé lors de l'affichage dans un document html (faille xss) et pas lors de l'utilisation des données avec une bdd. Pour éviter les injections sql, on utilise avec PDO soit les requêtes préparées, soit la méthode quote(). Par exemple en utilisant la méthode quote() avec ton code :
$login = $bdd->query("SELECT count(*) FROM users WHERE username=" . $bdd->quote($_POST['pseudo']) . " AND password=" . $bdd->quote($_POST['pseudo']));
Bonne journée

Eléphanteau du PHP | 39 Messages

28 nov. 2014, 12:42

J'ai effectivement lu ceci:
http://php.net/manual/fr/pdostatement.r ... ample-1026
Mais je n'ai pas tout compris.Et comme il est nécessaire de bien tout comprendre pour mener à bien une tâche particulière, j'ai dû abandonner cette solution qui consiste à compter ce qui est sélectionné.
Car compter ça va.Mais c'est le traitement du comptage au final qui est le plus difficile.
Par contre j'ai trouvé une autre solution qui consiste à établir une comparaison des pseudos et des mots de passe en utilisant une boucle while pour autoriser l'accès à un espace membre.
Cela fonctionne. Bien que sans doute plus compliqué que ta solution.
Cependant j'aimerai bien suivre ton conseil concernant la sécurité sur les injections.Mais lorsque je présente ce code:
$req = $bdd->query ("SELECT * FROM users WHERE username='$pseudo' AND password='$password'". $bdd->quote($_POST['pseudo']) . " AND password=" . $bdd->quote($_POST['pseudo']));
Le message suivant apparait:
Nom d'utilisateur ou mot de passe incorrect
Peux tu m'en donner la raison?
Merci
<?php

session_start();

if(isset($_POST['submit']))
{
	$pseudo = htmlspecialchars(trim($_POST['pseudo']));
	$password = htmlspecialchars(trim($_POST['password']));
	
	if(empty($pseudo))
		{
		echo"Veuillez saisir votre pseudo<br/>";	
		}else if(empty($password))
			{
			echo"Veuillez saisir votre mot de passe";
			}else 
			
				
				try
				{
				$bdd = new PDO('mysql:host=localhost;dbname=phpmembre', 'root', '');
				}	
					catch (Exception $e)
					{
					die('Erreur : ' . $e->getMessage());
					}
					$password = md5($password);
						 	
					$req = $bdd->query ("SELECT * FROM users WHERE username='$pseudo' AND password='$password'");
					
					while($row = $req->fetch()) 
					  
					{  
					 if ($row['username']==$pseudo);						 
						{
						 if ($row['password']==$password);							    
							{
							$_SESSION['pseudo'] = $pseudo;						
							header('Location:membre.php');
							} 																 
						}
					}echo "Nom d'utilisateur ou mot de passe incorrect";	
					
  $req->closeCursor();    
									
}	
?>

<h1>Connexion</h1>
<form method="post" action=""> 

<p>Votre pseudo</p>
<input type="text" name="pseudo" /><br/>

<p>Votre mot de passe</p>
<input type="password" name="password" /><br/><br/>

<input type="submit" name="submit" value="Se connecter" />
</form>

<a href="register.php">Pas encore membre</a>