Verification de mot de passe

Eléphanteau du PHP | 10 Messages

30 déc. 2012, 23:31

Bonjour,
Je viens d'apprendre le php et je me lance dans l'aventure de construire un forum ! J'ai un petit problème au moment de vérifier si c'est bien le bon mot de passe lors de la connexion... en effet je n'arrive pas à afficher " mauvais mot de passe" lorsque que celui ci est faux. Mais j'arrive à que sa se connecte quand le mot de passe et le pseudo sont corrects et sa ne se connecte pas lorsque le mots de passe ou le pseudo est faux.
je ne reçois aucun message d'erreurs...
Voici le formulaire de connexion :
<?php

if(isset($_SESSION['pseudo'])) //si $_SESSION existe cela veut dire que l'on est déjà connecté ( on verifie si il existe ) 
							{
								?>
								<div id="deconnexion">
								<a href="deconnexion.php">Deconnexion</a>
								</div>
								<?php
								$verification_etat_connexion=true; // La variable est utilisé ligne 73
							}
					
					
						if(isset($verification_connexion)) // si $ verification connexion existe on execute ( la variable a était créer si le mdp ou le pseudo est incorrect  )
							{
								
										?>
											<div id="connexion">
											
												<p> Votre pseudo ou votre mot de passe sont incorrectes !</p>
												<form method="post" action="traitement_connexion.php" />
												Pseudo: <input type="text" name="pseudo" /></br>
												Mot de passe: <input type="password" name="mot_de_passe" /><br>
												<input type="submit" value="Valider" /></br>
											
											</div>
										<?php
									
							}
					else
					{
						if(isset($verification_etat_connexion)) // si sa existe alors on fait rien en gros si $_SESSION existe alors on faite rien sinon sa veut dire que l'on vient d'arriver
							{
							}
							else
								{
									?>
									<div id="connexion">
										
										<form method="post" action="traitement_connexion.php" />
										Pseudo: <input type="text" name="pseudo" /></br>
										Mot de passe: <input type="password" name="mot_de_passe" /></br>
										<input type="submit" value="Valider" /></br>
										
											<div id="demande_inscription"></div>
												Tu veux t'inscrire ? </br>
												<a href="formulaire_inscription.php"> Alors clique içi !</a>
											</div>
									<?php	
								}
					}
?>

et le traitement du formulaire de connexion est içi :
<?php

// on protége toute les données du formulaire et on hache le mot de passe 
$_POST['pseudo']=htmlspecialchars($_POST['pseudo']); 
$_POST['mot_de_passe']=htmlspecialchars($_POST['mot_de_passe']);
$_POST['mot_de_passe']=sha1($_POST['mot_de_passe']);

include("connexion_bdd.php");// connexion BDD
//requète préparer, on place dans $réponse l'ID dans la table compt ou le pseudo = pseudo formulaire et pareil pour le mdp
$reponse=$bdd->prepare('SELECT ID FROM compte WHERE pseudo= :pseudo AND mot_de_passe= :mot_de_passe');
$reponse->execute(array( // on execute avec les variable du formulaire
'pseudo' => $_POST['pseudo'],
'mot_de_passe' => $_POST['mot_de_passe']));
 // on range $reponse pour le mettre dans $donnees qui est un array ( tableau)
$donnees=$reponse->fetch();
if  (!$donnees) // si il n'y a rien dans $donnees
{
	$verification_connexion;
	header('Location: accueil.php');
}
else // sinon, si il y a quelque chose 
{
	
	session_start(); //on créer une session
	
	header('Location:accueil.php'); // on va à l'accueil et on place des variables de session
	$_SESSION['ID'] = $donnees['ID']; 
	$_SESSION['pseudo'] = $_POST['pseudo'];
	
}



?>


J'avoue que je suis un peu perdu là et qu'un petit coup de main serait plus que le bienvenue !

À très bientôt !

Eléphanteau du PHP | 11 Messages

30 déc. 2012, 23:48

Salut,

Tu ne définis pas réellement la variable $verification_connexion :
$verification_connexion;
Pour la définir, tu dois procéder comme ceci :
$verification_connexion = '';
Ainsi, la variable est définie (bien que vide).

Il me semble qu'il n'est pas nécessaire d'utiliser la fonction htmlspecialchars pour un formulaire de connexion, d'autant qu'avec une requête préparée, les risques d'injections sont quasiment nuls. Mais je demande confirmation, ce que j'avance n'est pas sûr du tout, hein !

Imaginons qu'un membre ait comme mot de passe "<password", lors de la connexion, ta requête va chercher ">password". Alors à moins que tu n'aies utilisé la fonction htmlspecialchars avant l'enregistrement des données d'un nouveau membre, tu risques de te retrouver avec des erreurs de connexion !

Eléphanteau du PHP | 10 Messages

30 déc. 2012, 23:56

Après avoir apporter la modification demandé, cela ne marche toujours pas ...
Quelqu'un a une solution ?

Eléphanteau du PHP | 11 Messages

31 déc. 2012, 00:17

Après avoir défini ta variable $verification_connexion, tu rediriges vers la page d'accueil.
Or la variable n'est pas portée sur la page d'accueil!

Autrement dit, si $verification_connexion est bel et bien définie dans ton traitement_connexion.php,
elle ne l'est pas dans ton accueil.php !

Au fait, pour les redirections :
  • Un header() doit toujours être suivi d'un exit();
  • Dans ton deuxième header, n'oublie pas l'espace entre Location: et accueil.php

Eléphanteau du PHP | 10 Messages

31 déc. 2012, 00:37

Ok, je n'ai pas compris pour le exit () peux-tu m'expliquer le fonctionnement s'il te plaît ?
et si je modifie et que j'enlève le header pour le remplacer par include sa marche ou pas ?

Eléphanteau du PHP | 11 Messages

31 déc. 2012, 01:07

Voilà comment tu as utilisé ton header():
header('Location:accueil.php');
Tu devrais l'utiliser comme ceci, afin d'éviter d'eventuelles erreurs :
header('Location: accueil.php');
exit();
La fonction exit(); empêche l’exécution du reste du script. Puisque tu rediriges l'utilisateur vers la page d'accueil, le reste du script ne t'intéresse forcément plus, c'est pourquoi il est important de marquer son arrêt! Tu dois donc logiquement définir tes sessions avant le exit, comme ceci :
else 
{
        
        session_start(); // Création de la session
        $_SESSION['ID'] = $donnees['ID'];
        $_SESSION['pseudo'] = $_POST['pseudo'];
        
        header('Location: accueil.php'); // Redirection vers l'accueil
        exit(); // Fin du script
}
Un include marcherait, mais ça ne serait pas propre !

Le fait est que tu crées le formulaire de connexion sur la page d'accueil, ce qui peut apparaître comme une difficulté supplémentaire.
Si tu souhaites faire ça de façon relativement propre, je te conseille de faire un include sur ton accueil, vers un fichier .php comprenant ton formulaire et le code qui va avec.

En gros sur ton accueil.php :
include('includes/widgets/login.php'); // Inclusion du fichier login.php

Personnellement je crée toujours un dossier includes/ pour les fichiers que j'ai à inclure
Et un dossier widgets/ comprenant les fichiers que j'ai à inclure sur toutes les pages (comme c'est souvent le cas pour les formulaires de connexion que l'on trouve en haut des sites, sur chaque page)


Et dans ton fichier includes/widgets/login.php, tu affiches ton formulaire tout comme tu le traites.
  • Si le formulaire a été rempli :
    • Si les infos rentrées sont correctes : Je crée la session et affiche le lien de déconnexion.
    • Sinon : J'affiche le formulaire de connexion et l'erreur.
  • Sinon :
    • L'utilisateur n'a pas essayé de se connecter, je lui affiche donc le formulaire de connexion.
    J'affiche le formulaire de connexion

ViPHP
ViPHP | 1996 Messages

31 déc. 2012, 16:02

Après
 $donnees=$reponse->fetch();
que donnes
var_dump ($donnees) ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr