2012-02-14 5 views
0

Notes:PHP - Comparer hachage avec base de données ne fonctionne pas

  • Je suis encore assez nouveau pour php
  • Ce formulaire de connexion semble fonctionner parfaitement bien si je ne Hash pas le mot de passe.
  • J'ai essayé md5, sha256 et maintenant je l'ai laissé à sha1. Aucun de ces travaux.
  • J'ai d'abord utilisé echo sha1("password"); pour trouver ce que le hachage de mon mot de passe serait, j'ai ensuite copié ce hachage et je l'ai collé manuellement avec phpMyAdmin. Je ne suis pas sûr si c'est ce que le problème est ou non.

Anyways Voici le code:

<?php 
session_start(); 
require("config.php"); 

if(isset($_POST['submit'])) { 

    $username = mysql_real_escape_string($_POST['username']); 
    $password = sha1(mysql_real_escape_string($_POST['password'])); 

    $loginsql = "SELECT * FROM login WHERE username = '" . $username . 
    "' AND password = '" . $password . "'"; 
    $loginresult = mysql_query($loginsql); 
    $loginnumrows = mysql_num_rows($loginresult); 

    if($loginnumrows == 1) { 
     $loginrow = mysql_fetch_assoc($loginresult); 
     session_register("USERNAME"); 
     session_register("USERID"); 

     $_SESSION['USERNAME'] = $loginrow['username']; 
     $_SESSION['USERID'] = $loginrow['id']; 

     header("Location: " . $config_basedir . "controlpanel.php"); 
    } 
    else{ 
     echo "<p>Incorrect Login, please try again!</p>"; 
    } 
} 
else{ 

} 
?> 

Je ne suis pas trop sûr où aller avec cela. Je suis sûr que mon code pourrait être plus efficace mais comme je l'ai mentionné dans les notes, cela fonctionne quand je n'ai pas le mot de passe. Merci pour la lecture.

+1

Comment est configuré le mot de passe dans votre base de données? –

+1

Vous ne devriez pas utiliser mysql_real_escape_string jusqu'à ce que les données soient envoyées à la base de données.Plus précisément, 'sha1 (mysql_real_escape_string ($ _ POST ['mot de passe']))' 'devrait être' mysql_real_escape_string (sha1 ($ _ POST ['mot de passe'])); Nous ne pouvons pas non plus voir comment le mot de passe * stocké est haché, donc nous ne pouvons pas vraiment vous aider. Essayez de sélectionner l'enregistrement et 'var_dump' votre mot de passe. Comparez cela avec la valeur affichée sur le serveur. Ce sont des étapes de débogage de base que vous devriez apprendre à suivre. – meagar

+1

Avez-vous essayé '$ password = sha1 ($ _ POST ['mot de passe']);'? Pas besoin de mysql_real_escape_string ici. – aletzo

Répondre

1

Si cela fonctionne lorsque vous ne saisissez pas le mot de passe, il semble que vos mots de passe soient stockés dans la base de données sous forme de texte en clair - ce serait là que je vérifierais.

L'autre chose qui pourrait se produire est que la chaîne mysql_real_escape devrait être utilisée de l'autre côté du sha1 afin qu'elle n'interfère pas avec l'entrée exacte.

Il devrait donc être: mysql_real_escape_string(sha1($_POST['password'])); Cela pourrait changer les choses un peu.

Note: Bien que SHA1 ne dispose pas actuellement des problèmes de sécurité connus il devrait être sûr de mettre directement dans la base de données sans l'évasion mysql, quelqu'un m'a dit une fois de toujours vérifier tout ce qui se passe dans la base de données devrait être lancé ou échappé juste au cas où une vulnérabilité de sécurité est trouvée dans quelque chose comme sha1 ou md5.

+0

C'est ce que je pensais être le problème, mais je ne suis pas sûr de savoir comment changer cela. – finec

+0

Je crois qu'ils signifient que cela fonctionne quand ils ne hachent pas le mot de passe dans les deux endroits. (signifie texte en clair dans db et recherche de texte en clair) –

+0

Désolé, j'ai manqué que vous aviez copié un sha1 et l'ai mis dans la base de données. Je voudrais essayer 'echo $ password;' après avoir été dans le sha1, puis récupérer le résultat et l'insérer dans la base de données et voir si cela fonctionne. –

4

Cela ne fonctionnera pas, si votre mot de passe contient ' ou d'autres caractères évitables.

$password = sha1(mysql_real_escape_string($_POST['password'])); 

Vous devez hacher, puis échapper:

$password = mysql_real_escape_string(sha1($_POST['password'])); 

Et comme SHA1 ne contient que [a-f0-9], vous pouvez ainsi sauter le escpaing

$password = sha1($_POST['password']); 
+0

Je suis d'accord c'est la meilleure réponse. J'ai remarqué qu'il était hashing après s'être échappé. – LF4

+0

J'ai oublié de le mentionner, mais j'ai déjà essayé et cela ne règle pas mon problème. Merci quand même. – finec

1

Il semble que vos mots de passe dans le base de données ne sont pas hachées, vous devez changer cela et votre formulaire d'inscription afin que tous utilisent la même méthode de hachage.

Vous pouvez changer tous les mots de passe dans la base de données en utilisant la fonction MySQL SHA1().

0

Le mot de passe échappé n'est pas le même mot de passe que le mot de passe entré. Le has ne contiendra aucun caractère spécial. Abc 'sha1! = Échappé abc \' sha1

Questions connexes