0
votes

Comment se connecter sans hachage le mot de passe en SQL?

Bon après-midi! Je travaille seul dans un projet de sécurité. J'ai des problèmes avec mon code de connexion de la vérification de PHP. Je ne sais pas pourquoi, mais lorsque j'essaie de me connecter avec un utilisateur que j'ai créé "le mot de passe dans la base de données, il est en texte brut", il est indiqué que le mot de passe est incorrect.

L'idée est de ne pas convertir le mot de passe dans un hachage. Je sais que c'est un risque de sécurité important, mais évidemment que je ne l'utiliserai pas pour une utilisation professionnelle. Mon objectif est pour les tests de sécurité.

check.php: xxx

Modifier J'ai corrigé les erreurs, mais j'ai toujours des problèmes de journalisation , apparaît un menssage: "Le nom ou le mot de passe sont incorrects!". Dans ma base de données, j'ai 4 colonnes sans avoir haché les informations. ID, nom, email, mot de passe


7 commentaires

Password_Verify () Impossible de gérer le stockage de mots de passe de texte brut. Il est conçu pour la tâche exacte opposée.


Si vous souhaitez comparer des chaînes simples, utilisez === ou STRCMP , pas pw_verify . La justification de faire cela est entièrement faux, BTW. Comme le manque de liaison des paramètres.


Je me souviens de fermer une même question plus tôt et que vous avez fait pas suivre les étapes de tous les doublons "à la lettre".


AVERTISSEMENT : Écrire votre propre couche de contrôle d'accès n'est pas facile et il existe de nombreuses occasions de l'obtenir gravement faux. S'il vous plaît, n'écrivez pas votre propre système d'authentification lorsqu'il est moderne Cadre de développement comme Laravel est livré avec un robuste Système d'authentification intégré.


Remarque: l'interface orientée objet vers mysqli est significativement moins verbeuse, ce qui facilite la lecture et la vérification, et n'est pas facilement confondu avec l'interface obsolète MySQL_Query . Avant de vous rendre trop investi dans le style de procédure, il convient de passer à autre chose. Exemple: db = nouveau mysqli (...) et $ db-> préparer ("...") L'interface procédurale est un artefact de l'ère PHP 4 lorsque MySQLI API a été introduit et ne doit pas être utilisé dans le nouveau code.


AVERTISSEMENT : Lorsque vous utilisez mysqli , vous devez utiliser requêtes paramétrées et bind_param pour ajouter des données utilisateur à votre requête. Ne pas Utiliser une interpolation de chaîne ou une concaténation pour y accomplir, car vous avez créé une grave Bug d'injection SQL < / a>. jamais Met $ _ POST , _ get ou ou des données utilisateur directement dans une requête, il peut être très nocif si Quelqu'un cherche à exploiter votre erreur.


Avant de rechercher votre condition If, débogez votre résultat renvoyé de votre base de données et comparez s'il s'agissait des valeurs définies dans votre message.


3 Réponses :


4
votes

Si le mot de passe de la base de données est stocké dans un texte brut, le problème est que mot de passe_verify () - comme expliqué dans le manuel - s'attend à ce que le deuxième argument soit (et je cite):

Un hachage créé par mot de passe_hash () .

La fonction essaiera de hachage la variable $ _Post de la même manière qu'il suppose que la variable $ en ligne est hachée, puis compare la variable Hashed $ _Post à la variable $ en ligne. Clairement, cela ne provoquera jamais de correspondance valide, car la variable $ en ligne n'est pas un hachage valide.

Cette fonction ne fait pas une simple comparaison directe des chaînes données. Si vous voulez faire cela, écrivez simplement si ($ _post ["mot de passe '] === $ ligne [" mot de passe "]) à la place, pas besoin d'une fonction supplémentaire!


4 commentaires

Salut @adyson, merci de l'aide mais le code que cela ne fonctionne toujours pas "apparaît d'un message mensssial" Nom ou mot de passe est incorrect! ", Je dois peut-être changer autre chose ... Si vous êtes si gentil, pouvez-vous vérifier le code si Tout ce qui va bien? J'ai téléchargé le code ici: sandbox.onlinephpfonctions.com/code/....


@Daz Le code semble fonctionner. Cela pourrait être aussi simple que de ne pas utiliser les valeurs de données correctes ou n'envoyer pas les données via Post. Je ne sais pas quelles données vous soumettez ou ce qui est dans votre base de données. Quel débutant avez-vous fait? Utilisez une autre Var_Dump () instructions pour sortir les valeurs de vos variables sur L'écran afin que vous puissiez vérifier qu'ils contiennent ce que vous attendez.


@DAZ VEUILLEZ également NE PAS CHANGER LA QUESTION AVEC CODE DIMONNAIRE - MAINTENANT LES RÉPONSES ICI N'AFFAIRE PAS TELLEMENT SENSE. Remettez la question de la manière dont il était, ou du moins inclure le code d'origine ainsi que votre version modifiée. Merci.


Ok laissez-moi un moment pour changer la question



0
votes

Dans votre cas, vous ne pouvez pas utiliser Password_Verify () car il est utilisé uniquement pour le mot de passe hachégé (par mot de passe_hash ())

Vous devez vérifier le mot de passe comme p>

if ($password == $row['password']) 


1 commentaires

Salut @balzaclegeek, merci de l'aide, mais le code que cela ne fonctionne toujours pas "apparaît d'un message mensssial" Nom ou mot de passe est incorrect! ", Je dois peut-être changer quelque chose d'autre ... si vous êtes si gentil, pouvez-vous vérifier le code si Tout ce qui va bien? J'ai téléchargé le code ici: sandbox.onlinephpfonctions.com/code/...



1
votes

Vous nous avez montré le code qui lit le mot de passe (ou échoue à). Mais vous nous avez montré le code qui remplit le mot de passe ni conseillé si vous avez vérifié que les données étaient ce que vous attendiez.

Bien que je comprenne que vous ne voulez pas tomber dans la route de la hachage de mot de passe, vous devriez vraiment apprendre un peu sur la sécurité des applications Web. Vous pourrez vous connecter en fournissant le nom d'utilisateur comme xxx

avoir une injection de SQL Google pour SQL.

Il n'y a pas de vérification / manipulation d'erreur dans votre code . Chaque appel à MySQLI doit avoir un gestionnaire d'erreur associé à celui-ci.

Vous pouvez commencer à résoudre votre problème en écrivant le SQL généré sur le navigateur et en l'exécutant via le client de la ligne de commande MySQL ou PHPMYADMIN pour vérifier que Il renvoie toutes les données. Vous devez également vérifier votre code que zéro ou un enregistrement est renvoyé par la requête (et gérer chaque cas en conséquence).

Si vous n'apprenez pas à déboguer, vous n'apprenez pas à programmer. < / p> xxx

Seul la variable "nom" doit être définie comme une variable de session.


0 commentaires