[RESOLU] Compatibilité password_verify() et requete SQL

Codeurdudimanche
Invité n'ayant pas de compte PHPfrance

12 juil. 2014, 18:43

Bonjour tout le monde =D

J'essaie de faire un espace membre à un site, avec l'habituelle trip des mots de passe et tout le tralala. Je souhaite crypter un peu tout ca.
Donc j'ai un formulaire d'inscription qui marche parfaitement et qui hash les mots de passe avec la fonction password_hash() :

Code : Tout sélectionner

$password=password_hash($_POST['mdp'], PASSWORD_DEFAULT)."\n";
Là pas de souci, pour vérifier je veux utiliser par conséquent password_verify(),
alors quand je fais un truc du genre ca, ca marche :

Code : Tout sélectionner

if (password_verify('hhh', '$2y$10$I7L0GovZEaHKUO5UMMj9m.GD8KbzATRmv4Dg0ZixfQlhwdYiGHcLm')){ print 'oui'; } else { print 'non'; }
Avec comme mot de passe 'hhh' et le hash qui va bien il me sort oui, pas de souci, maintenant je cherche le hash dans la base de donnée :

Code : Tout sélectionner

// Connect to database server $mysqli= new mysqli("serveur", "id", "mdp", "mabd"); /* Vérification de la connexion */ if ($mysqli->connect_errno) { printf("Échec de la connexion : %s\n", $mysqli->connect_error); exit(); } $response = "SELECT password FROM user WHERE login = 'hhh'"; $res=mysqli_query($mysqli,$response); $re=mysqli_fetch_assoc($res)['password']; if (password_verify('hhh', $r)){ print 'oui'; } else { print 'non'; }
Dans ce cas il me sort "non", même si quand je print $re c'est le bon hashé qui sort, même si je settype ou strval en chaine de caractère. J'ai aucune idée comment régler ce problème ou où chercher des solutions.

Merci d'avance pour votre temps !
Bonne soirée !

Codeurdudimanche
Invité n'ayant pas de compte PHPfrance

12 juil. 2014, 18:45

évidemment l'erreur n'est pas là :

Code : Tout sélectionner

if (password_verify('hhh', $rE)){
Excusez moi pour cette coquille :)

Mammouth du PHP | 1339 Messages

12 juil. 2014, 20:09

Si tu fais print_r($re);
Tu as bien le mot de passe ?

Apres personnellement utilise plutot MD5 pour crypter tes mots de passe car contretement a ta fonction MD5 ne peut pas être decrypter .. Donc tu compares si les 2 encryptations sont identiques.
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Codeurdudimanche
Invité n'ayant pas de compte PHPfrance

13 juil. 2014, 11:40

Merci de ta réponse.

Si je printr c'est le bon hashé qui sort, c'est pour ca que je ne comprend pas ><

Mammouth du PHP | 1339 Messages

13 juil. 2014, 12:09

Si je fais ca forcement ca marche :
$re = password_hash('test', PASSWORD_DEFAULT);
echo password_verify('test', $re) ? 'Oui' : 'Non';
Fait en sorte de débuggé ton code en mettant des echo un peu partout ...
<?php

   // Connect to database server
   $mysqli= new mysqli("serveur", "id", "mdp", "mabd");
   if ($mysqli->connect_errno) {
       printf("Échec de la connexion : %s\n", $mysqli->connect_error);
       exit();
   }
   
	$sql = "SELECT `password` FROM `user` WHERE `login` = 'hhh'";
	$req = mysqli_query($mysqli, $sql);
	$row = mysqli_fetch_row($req);
	
	echo 'Le password crypté = '.password_hash('hhh', PASSWORD_DEFAULT).'<br />';
	echo 'Le password dans la base de données est : '.$row['password'].'<br />';
	echo password_verify('hhh', $row['password']) ? 'Ca marche' : 'Ca marche pas';
	

?>
Bon sinon tu me fais un message privé et on se fait un TeamViewer

Codeurdudimanche
Invité n'ayant pas de compte PHPfrance

13 juil. 2014, 16:40

J'ai réussi à le faire marcher !
En faite, $re contenait un espace à la fin...pourquoi ? je sais pas. il suffit de l'enlever et ca marche !

Code : Tout sélectionner

$response = "SELECT password FROM freelance_user WHERE login = 'hhh'"; $res=mysqli_query($mysqli,$response); $re=mysqli_fetch_assoc($res)['password']; $o=substr($re,0,-1); //on enlève l'espace à la fin print_r($o); if (password_verify('hhh',$o)){ print 'oui'; } else { print 'non'; }
En tout cas merci pour tout :D

Mammouth du PHP | 1339 Messages

13 juil. 2014, 16:43

Utilise trim() mais faut que tu comprennes d'où vient l'espace car la c'est bric-à-brac...
Bon sinon tu me fais un message privé et on se fait un TeamViewer