dans le code 'vérification des identifiants', l'auteur utilise une vérification identique à l'aide de password_hash mais cette fonction renvoi systématiquement une valeur différente ce qui empêche le script d'être exploité, je pense qu'il faut utiliser password_verify.
Correct. Ils ont "bêtement" substitué un sha1 ou je ne sais quoi par password_hash or c'est faux car le grain de sel généré lors de l'appel à password_hash étant différent, deux invocations de password_hash, avec les mêmes paramètres, a une improbable chance de générer le même hash.
1) le texte qui dit qu'il suffit de comparer 2 résultats de password_hash n'est plus d'actualité
> Lorsqu'un visiteur voudra se connecter, il vous enverra son mot de passe que vous hacherez à nouveau et que vous comparerez avec celui stocké dans la base de données. Si les deux mots de passe hachés sont identiques, alors cela signifie que le visiteur a rentré le même mot de passe que lors de son inscription.
2) le code doit être adapté :
supprimer AND pass = :pass de la requête SELECT
du coup retirer le bind de :pass (soit la partie 'pass' => $pass_hache)
changer le SELECT id FROM en SELECT id, pass FROM - à moins d'un SELECT * FROM
virer la ligne $pass_hache = password_hash($_POST['pass'], PASSWORD_DEFAULT);
enfin faire intervenir password_verify : if (!$resultat) devient if (!$resultat || !password_verify($_POST['pass'], $resultat['pass']))
EDIT : le cours a été corrigé mais le code aurait pu être bien meilleur :
le password_verify aurait pu être déplacé dans le else : inutile de tenter un password_verify si la requête ne renvoie rien. Heureusement que PHP renvoie NULL pour FALSE['pass'] et que password_verify accepte vraisemblablement NULL (puis cast vers string) sans lever la moindre erreur.
la répétition du message d'erreur ("Mauvais identifiant ou mot de passe !") aurait pu être évitée via un ou logique comme proposé dans ce même post
> Trying to use values of type null, bool, int, float or resource as an array (such as $null["key"]) will now generate a notice.
Etant donné que PHP >= 7.4.0 lève à présent une notice avec l'éventuel FALSE['pass'] vu que le password_verify est fait avant d'avoir vérifié qu'une ligne est bien renvoyée (ie que if (!$resultat) est vrai) au lieu d'après, serait-il donc possible de (re)corriger le cours (et si possible en évitant la répétition du echo 'Mauvais identifiant ou mot de passe !';) ?
Au minimum déplacer la ligne 10 en début du premier else quoi.
14 juin 2021 à 12:01:20
- Message modéré pour le motif suivant : Merci de créer votre propre sujet
"Erreur" dans cours PHP
× Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
× Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli
Keep It Simple Stupid - SF4 conf Swift - Cours 1/4 SF4 - Exceptions PDO - Formes Normales
julp.fr ~ PHP < 8.0.0 : activer les erreurs PDO/SQL ~ PHP < 8.1.0 : activer les erreurs mysqli