8145 sujets

Développement web côté serveur, CMS

Bonsoir à tous,

Je me suis lancer dans le projet de codé un crm pour ma société.
J'ai un petit soucis avec le code... Smiley confus
Je vous expliques !
dans la Bdd tout se passe bien, j'ai fais mon user niquel, je tente de me connecter du coup et la impossible.
Si quelqu'un aurait le temps de jeté un petit coup d’œil car je vous avoues que je trouves pas et sa fait plusieurs heure que je suis dessus.

<?php
session_start();
	if(isset($_POST['submit']))
	{
	$pseudo=htmlentities(trim($_POST['pseudo']));
	$mdp=htmlentities(trim($_POST['mdp']));

		if($pseudo&&$mdp)
		{
			$mdp = md5($mdp);
			$sql =mysqli_connect('localhost','root','','vip_pro_crm')or die ('Error');
			
			$query =mysqli_query($sql,"SELECT * FROM utilisateur WHERE pseudo='$pseudo'&&mdp='$mdp'");
			$rows =mysqli_num_rows($query);
			if($rows==1)
			{
			$_SESSION['pseudo']=$pseudo;
			header("location:membre.php");
			}else echo "Utilisateur ou mot de passe incorrecte !!";
		}
	}
?>
<form method="POST" action="login.php">
<p>Pseudo : </p>
<input type="text" name="pseudo">
<p>Mot de passe : </p>
<input type="password" name="mdp">
<input type="submit" value="Connexion" name="submit">
</form>
Bonjour,
A mon avis il faut avoir uniquement le pseudo dans le WHERE, et ensuite vérifier que le mdp saisi correspond bien à celui en BDD pour valider la connexion. Par contre, pour vérifier ça, il faut utiliser la fonction
$test = password_verify($mot_de_passe_saisi,$mot_de_passe_en_BDD)
Et pour que ça fonctionne, le hash du mot de passe à la création de l'utilisateur doit être fait avec cette fonction:
$pass_a_mettre_en_BDD = password_hash($mot_de_passe_saisi, PASSWORD_DEFAULT); 


Sinon, une remarque à part... Pour accéder à ta BDD, renseignes toi sur les requêtes préparées et PDO, tu as beaucoup à y gagner, surtout au niveau sécurité!
Salut

SELECT * FROM utilisateur WHERE pseudo='$pseudo'&&mdp='$mdp'

le "ET" en SQL c'est AND... pas "&&"

SELECT *
FROM utilisateur
WHERE pseudo='$pseudo'
AND mdp='$mdp'
Modifié par JENCAL (12 Nov 2019 - 11:03)
JENCAL a écrit :
le "ET" en SQL c'est AND... pas "&&"

Purée j'ai même pas vu ça! Je fais trop de PHP^^
Modifié par Mathieu8337 (12 Nov 2019 - 11:55)
Bonsoir Mathieu,

Merci de ta réponse je dois t'avouer que j'essaye depuis et je n'ai pas du comprendre...
Si ce n'est pas trop te demander les variables que tu ma donnés corresponde a quoi dans mon code.

Merci Jencal pour l'info. Smiley smile
Hello vip,

Pour la partie PHP, ça ferait un truc du genre :

<?php
session_start();
if(isset($_POST['submit']))
{
	$pseudo = htmlentities(trim($_POST['pseudo']));
	$mdp = htmlentities(trim($_POST['mdp']));

	if($pseudo && $mdp){
		// $mdp = md5($mdp);  Ligne supprimée
		// $sql =mysqli_connect('localhost','root','','vip_pro_crm') or die ('Error'); // Supprimé, il vaut mieux utiliser PDO
		$sql = new PDO('mysql:dbname=vip_pro_crm;host=127.0.0.1','root',''); //Connexion à la BDD en PDO
		
		$query = $sql->prepare("SELECT * FROM utilisateur WHERE pseudo = ?"); //Préparation de la requête

		if($query->execute(array($pseudo))){ //Envoi de la requête
			if($user_infos = $query->fetch(PDO::FETCH_ASSOC)){
				if(password_verify($mdp,$user_infos['mdp'])){ //Vérification du mot de passe
					$_SESSION['pseudo'] = $pseudo;
					header("location:membre.php");
				} else echo "Mot de passe incorrect !!";
			} else echo "Utilisateur non existant !!";
		} else echo "Erreur lors de la requête !!";
	}
}

J'ai utilisé PDO plutôt que mysqli_connect etc, c'est vachement mieux (par contre, il faudra ajuster par rapport à ta base, je te conseille de lire ça: https://www.php.net/manual/fr/pdo.construct.php)

Ensuite, sur ton script d'enregistrement des utilisateurs (à faire en PDO aussi...) tu dois avoir quelque part un bout de code qui ressemble à ça:

$pseudo = $pseudo = htmlentities(trim($_POST['pseudo']));
$mdp = md5(htmlentities(trim($_POST['mdp'])));
mysqli_query($sql, "INSERT INTO utilisateurs(pseudo, mdp) VALUES ('$pseudo','$mdp')")

Il faudrait remplacer par :

$pseudo = $pseudo = htmlentities(trim($_POST['pseudo']));
$mdp = password_hash(htmlentities(trim($_POST['mdp'])), PASSWORD_DEFAULT);
$query = $sql->prepare("INSERT INTO utilisateurs(pseudo, mdp) VALUES (?,?)");
$query->execute(array($pseudo,$mdp));


Et voilà! Bon courage tiens-nous au courant Smiley smile
Et pour info, dans ton code de base il y a autre chose qui posait très certainement problème, c'est ta ligne
if($pseudo&&$mdp)
Le fait de coller "&" et "$" ça change beaucoup de choses pour PHP, donc il faut mettre des espaces :
if($pseudo && $mdp)

A+!
Modifié par Mathieu8337 (14 Nov 2019 - 10:00)
Salut Mathieu,

Bon j'ai faits tout ce que tu ma dis il n'y a pas de message d'erreur bon point
un grand merci Smiley smile

CEPENDANT, il y a toujours un cependant...
Mot de passe incorrect pourtant je peux te garantir que le mot de passe que je rentre est identique.

a+
Le Register.php


<?php
/* Connexion à une base MySQL avec l'invocation de pilote */
$dsn = 'mysql:dbname=vip_pro_crm;host=127.0.0.1';
$user = 'root';
$password = '';

try {
    $sql = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connexion échouée : ' . $e->getMessage();
}

?>


<?php

if(isset($_POST['submit']))
{
$pseudo = $pseudo = htmlentities(trim($_POST['pseudo']));
$mdp = password_hash(htmlentities(trim($_POST['mdp'])), PASSWORD_DEFAULT);

{


$query = $sql->prepare("INSERT INTO utilisateur(pseudo, mdp) VALUES (?,?)");
$query->execute(array($pseudo,$mdp));
	
die("Inscription terminée <a href='login.php'>connectez </a> vous");

}
}	
?>

<form method="POST" action="register.php">
<p>Pseudo : </p>
<input type="text" name="pseudo">
<p>Mot de passe : </p>
<input type="password" name="mdp">
<input type="submit" value="Connexion" name="submit">
</form>


Login.php

<?php
/* Connexion à une base MySQL avec l'invocation de pilote */
$dsn = 'mysql:dbname=vip_pro_crm;host=127.0.0.1';
$user = 'root';
$password = '';

try {
    $sql = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connexion échouée : ' . $e->getMessage();
}

?>

<?php
session_start();
if(isset($_POST['submit']))
{
	$pseudo = htmlentities(trim($_POST['pseudo']));
	$mdp = htmlentities(trim($_POST['mdp']));

	if($pseudo && $mdp){
		// $mdp = md5($mdp);  Ligne supprimée
		// $sql =mysqli_connect('localhost','root','','vip_pro_crm') or die ('Error'); // Supprimé, il vaut mieux utiliser PDO
		$sql = new PDO('mysql:dbname=vip_pro_crm;host=127.0.0.1','root',''); //Connexion à la BDD en PDO
		
		$query = $sql->prepare("SELECT * FROM utilisateur WHERE pseudo = ?"); //Préparation de la requête

		if($query->execute(array($pseudo))){ //Envoi de la requête
			if($user_infos = $query->fetch(PDO::FETCH_ASSOC)){
				if(password_verify($mdp,$user_infos['mdp'])){ //Vérification du mot de passe
					$_SESSION['pseudo'] = $pseudo;
					header("location:membre.php");
				} else echo "Mot de passe incorrect !!";
			} else echo "Utilisateur non existant !!";
		} else echo "Erreur lors de la requête !!";
	}
}
?>

<form method="POST" action="login.php">
<p>Pseudo : </p>
<input type="text" name="pseudo">
<p>Mot de passe : </p>
<input type="password" name="mdp">
<input type="submit" value="Connexion" name="submit">
</form>
De rien!
Essaye de faire un var_dump de $user_infos juste avant de vérifier le mot de passe, pour voir si tu récupères bien tout ce qu'il faut dans ta BDD?
Sinon attention à deux petites choses :
- Page register cette ligne va merder^^
 $pseudo = $pseudo = htmlentities(trim($_POST['pseudo']));

- Page login, tu fais une deuxième fois la connexion à ta base, donc ça écrase la première qui est la bonne (l'enfer du copié/collé^^). C'est peut-être ça qui fait merder la vérification du mdp d'ailleurs
 $sql = new PDO('mysql:dbname=vip_pro_crm;host=127.0.0.1','root',''); //Connexion à la BDD en PDO
Merci pour l'info Smiley cligne pour le register
pour le reste ça ne fonctionne toujours pas "Mot de passe incorrect !!"

pour le var dump :
array (size=3)
'id' => string '4' (length=1)
'pseudo' => string 'yo' (length=2)
'mdp' => string '$2y$10$bUcK3C6pwqY3S' (length=20)

Mot de passe incorrect !!
Seulement 20 caractères pour un mot de passe haché? Ça me paraît bien court... tu n'as pas limité le nombres de caractères de la colonne sur mySql? Pour vérifier tu peux faire un var_dump du mot de passe haché sur ta page register, et comparer avec ce qu'il y a en BDD.
Salut
Si j'ai limité les caractère en sql sa pose problème ?
ils sont identique.

$2y$10$bUcK3C6pwqY3S
Bon bah BINGO félicitation ta trouver la solution ça fonctionne.
Un très grand merci Mathieu.
La prochaine fois que j'ai un problème je t’appelle. mdr Smiley biggrin
Modifié par vip (15 Nov 2019 - 18:30)