comparaison d'un champ $_POST['pseudo'] par des valeurs dèjà en BdD

Eléphanteau du PHP | 15 Messages

21 mars 2008, 23:46

Bonsoir à tous,
ayant de trés faible connaissance je me permet de vous solliciter pour subvenir à mon petit problème...

J'ai une Base phpMyAdmin dans laquelle j'ai crée une table T_IDENTIFICATION avec trois champs
- id
- pseudo
- pass
Ces trois champs sont déjà en base remplis par trois utilisateurs,

Maintenant, sur ma page HTML, je demande une authentification, et je voudrais comparé le champ saisis et voir s'il apparait dans ma base, et si oui, je continue ma page, sinon je retourne a ma page de log
$pseudo=$_POST['pseudo'];

$connect = mysql_connect("localhost", "root", "");// connexion à la base
							
mysql_select_db("base",$connect);			//selection de la base de données

			if(!empty ($_POST['pseudo']))
			{echo " Désolé mais le Login est obligatoire "; }

			
$login = " SELECT pseudo FROM T_IDENTIFICATION  where pseudo="$pseudo"" ; 		//ensuite on parcourt le champs pseudo de la table T_IDENTIFICATION;

$result = mysql_query($login,$connect); 	// exécution de la requête et l'affecter a la variable $result 

echo $result;
if ($pseudo == $result)
{
....
J'aimerais aussi faire la même chose mais en vérifiant mon login ET le mot de passe aprés
Ma

Mammouth du PHP | 2937 Messages

22 mars 2008, 00:11

Un conseil : pour te prémunir d'une injection SQL, il faut échapper la variable utilisée dans ta requête, comme suit :
$login = " SELECT pseudo FROM T_IDENTIFICATION  WHERE pseudo=".mysql_real_escape_string ($pseudo);
Ensuite, pour vérifier le login et le mot de passe en même temps, il faut exécuter une requête de ce genre :
$pass = $_POST['pass'];
$login = " SELECT pseudo FROM T_IDENTIFICATION  WHERE pseudo=".mysql_real_escape_string ($pseudo)." AND pass=".mysql_real_escape_string ($pass);
Un autre conseil, lié aussi à la sécurité : il faut, si ce n'est déjà fait, hacher les mots de passe, de façon à ce qu'ils ne soient pas récupérables, grâce, notamment, à la fonction md5(). Dans ce cas, la requête ressemblera à ça :
$pass = $_POST['pass'];
$login = " SELECT pseudo FROM T_IDENTIFICATION  WHERE pseudo=".mysql_real_escape_string ($pseudo)." AND pass=MD5(".mysql_real_escape_string ($pass).")";
ou bien à ça
$pass = $_POST['pass'];
$login = " SELECT pseudo FROM T_IDENTIFICATION  WHERE pseudo=".mysql_real_escape_string ($pseudo)." AND pass=".md5 (mysql_real_escape_string ($pass));

Eléphanteau du PHP | 15 Messages

22 mars 2008, 00:35

Merci beaucoup de te pencher sur mon problème et de me prevenir concernant les injections SQL, j'etais pas au courant...


$login = " SELECT pseudo FROM T_IDENTIFICATION  WHERE pseudo=".mysql_real_escape_string ($pseudo)." AND pass=".md5 (mysql_real_escape_string ($pass)); 
$result_login = mysql_query($login);     // exécution de la requête et l'affecter a la variable $result
echo $result_login;
Rien n'es affiché à l'écran quand je fais un echo. Je sais pas de quoi ça pourrait venir

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Mammouth du PHP | 693 Messages

22 mars 2008, 00:42

Tes champs doivent être des champs de type VARCHAR. Il faut donc mettre les valeurs entre guillemets.

Lorsque tu execute une requete, il est toujours utile (en developement du moins) d'afficher les erreurs mysql comme cela par exemple
$result_login = mysql_query($login) or die(mysql_error())
De plus, mysql_query() renvoie une ressource dont il faut extraire les enregistrement, par exemple avec mysql_fetch_assoc()

Eléphanteau du PHP | 15 Messages

22 mars 2008, 00:51

Oui mes champs "pseudo" et "pass" sont bien de type VARCHAR dans ma base.

je mets le code mais je n'ai pas l'impression qu'il va chercher au bon endroit de ma base
Meme si le login et le pass et bon, il n'affiche pas ce qu'il devrait afficher.
Dans ma base "base", j'ai un champ ID, un champ "pseudo" et un champ "pass" déjà rempli.
//on récupère la veule des champs "pseudo" et "pass" de l'index.html
$pseudo = $_POST['pseudo'];
$pass = $_POST['pass'];

//on vérifie que les champs "pseudo" et "pass" ne sont pas vides
//s'ils sont vides, alors on ne va pas plus loin
if($pseudo=="")
	{
	echo " Désolé mais le Login est obligatoire "; 
	}	//fin du if($pseudo=="")
			
if($pass=="")
	{
	echo " Désolé mais le P@ss est obligatoire "; 
	}      //fin du if($pass=="")


// Si les deux champs sont remplis
if (($pseudo !="") && ($pass !=""))
	{
	// connexion à la base
	$connect = mysql_connect("localhost", "root", "")or die("Impossible de se connecter : " . mysql_error());

	//selection de la base de données "base"
	mysql_select_db("base",$connect);			

	//on parcourt le champ pseudo et pass de la table T_IDENTIFICATION
	$login = " SELECT pseudo,pass FROM T_IDENTIFICATION  WHERE pseudo=".mysql_real_escape_string ($pseudo)." AND pass=".md5 (mysql_real_escape_string ($pass)); 
	
	// exécution de la requête et l'affecter a la variable $result
	$result_login = mysql_query($login,$connect);     

	echo $result_login;
	echo $pseudo;
	
	//si les deux champs sont identiques, le login et le pass sont corrects, alors on affiche la page html, sinon one va pas plus loin
	if ($pseudo == $result_login) 
		{
?>

Merci à l'avance de votre aide et bonne journée

Mammouth du PHP | 693 Messages

22 mars 2008, 14:51

$login = " SELECT pseudo,pass FROM T_IDENTIFICATION  WHERE pseudo=".mysql_real_escape_string ($pseudo)." AND pass=".md5 (mysql_real_escape_string ($pass));
La, ta requete donne

Code : Tout sélectionner

SELECT pseudo,pass FROM T_IDENTIFICATION WHERE pseudo= Le_pseudo AND pass=Le_pass
Alors qu'il faudrait avoir une requete de ce type (VARCHAR oblige)

Code : Tout sélectionner

SELECT pseudo,pass FROM T_IDENTIFICATION WHERE pseudo= 'Le_pseudo' AND pass='Le_pass'
D'une facon général, les quotes sont obligatoires pour tout ce qui n'est pas un nombre.

Ensuite
if ($pseudo == $result_login)  
Ce test ne peut pas marcher convenablement car tu compares des données de type completement différent. $pseudo est une chaine de caractère alors que $reslut_login est une ressource, dont il faut extraire les enregistrement.

Par exemple, tu peux rempacer la fin de ton code par
$result = mysql_query($login,$connect);      
$result_login = mysql_fetch_assoc($result);
    echo $result_login['pseudo']; 
    echo $pseudo; 
     
    //si les deux champs sont identiques, le login et le pass sont corrects, alors on affiche la page html, sinon one va pas plus loin 
    if ($pseudo == $result_login['pseudo'])  
        { 

Eléphanteau du PHP | 15 Messages

22 mars 2008, 15:26

Merci beaucoup,

ça marhe maintenant et j'ai bien compris la méthode à suivre.

Par contre, je voudrais insérer les anti injections SQL à ce niveau
        //on parcourt le champ pseudo et pass de la table T_IDENTIFICATION
	$login= "SELECT pseudo FROM T_IDENTIFICATION  WHERE pseudo= '$pseudo' AND pass='$pass'";
	// on execute la requête
	$result = mysql_query($login,$connect); 
	
	//on mets les lignes dans un tableau     
	$result_login = mysql_fetch_assoc($result);
J'obtiens donc une requête
$login = " SELECT pseudo FROM T_IDENTIFICATION  WHERE pseudo=".mysql_real_escape_string ($pseudo)." AND pass=".mysql_real_escape_string ($pass);
Et j'ai cette rreur qui apparait :
Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource
Merci de m'aider

Mammouth du PHP | 693 Messages

22 mars 2008, 17:13

C'est parce que la requete SQL n'est pas bonne. Tu as bien les double quote qui délimitent les chaines en PHP, mais il te manque les quote pour délimiter les chaines pour MySQL. Ca donne donc une requete de ce style.

$login = " SELECT pseudo FROM T_IDENTIFICATION  WHERE pseudo='".mysql_real_escape_string ($pseudo)."' AND pass='".mysql_real_escape_string ($pass)."'";

Eléphanteau du PHP | 15 Messages

22 mars 2008, 17:29

Merci, comme ça, c'est niquel chrome :o

Je te souhaite une bonne journée.