2012-11-17 4 views
0

J'utilise un plugin jagru datagrid pour créer un outil simple pour modifier la table de mon utilisateur dans la zone d'administration d'un site. Je stocke les mots de passe en tant que md5() lorsque l'utilisateur s'enregistre. Chaque fois que j'essaie de mettre à jour la table, elle ressasse le mot de passe, le rendant inutilisable. J'ai essayé plusieurs méthodes de vérification du mot de passe qui est la même que celle de la base de données, mais aucune d'entre elles ne semble fonctionner.Ne correspond pas aux mots de passe md5

Voici mon code de mise à jour:

PHP

<?php 
require_once("../class/TimeClock.class.php"); 

$tc = new TimeClock(); 
$id = $_POST['id']; 
$username = $_POST['username']; 
$password = $_POST['password']; 
$email = $_POST['email']; 
$active = $_POST['active']; 
$role = $_POST['role']; 
$emp_id = $_POST['emp_id']; 

if($tc->validatePass($id, $password)) { 
try { 
    $tc->connect(); 
    $query = $tc->dbh->prepare("UPDATE us_users SET username=:username,email=:email,active=:active,role=:role,emp_id=:emp_id WHERE id=:id"); 
    $query->execute(array(':username' => $username, ':email' => $email, ':active' => $active, ':role' => $role, ':emp_id' => $emp_id, ':id' => $id)); 
    $tc->close(); 
} catch (PDOException $e) { 
    throw new Exception('Something bad happened' . $e->getMessage()); 
} 
} else { 
try { 
    $password = md5($password); 
    $tc->connect(); 
    $query = $tc->dbh->prepare("UPDATE us_users SET username=:username,password=:password,email=:email,active=:active,role=:role,emp_id=:emp_id WHERE id=:id"); 
    $query->execute(array(':username' => $username, ':password' => $password, ':email' => $email, ':active' => $active, ':role' => $role, ':emp_id' => $emp_id, ':id' => $id)); 
    $tc->close(); 
} catch (PDOException $e) { 
    throw new Exception('Something bad happened' . $e->getMessage()); 
} 
} 

echo json_encode(array(
'id' => $id, 
'username' => $username, 
'password' => $password, 
'email' => $email, 
'active' => $active, 
'role' => $role, 
'emp_id' => $emp_id 
)); 
?> 

Ma fonction validatePasss():

PHP

function validatePass($id, $pass) { 
    try { 
    $this->connect(); 
    $result = $this->dbh->prepare("SELECT username, password FROM us_users WHERE id=:id"); 
    $result->execute(array(':id' => $id)); 
    $userObj = $result->fetch(PDO::FETCH_ASSOC); 
    } catch(PDOException $e) { 
     throw new Exception('Something bad happened' . $e->getMessage()); 
     die(); 
    } 
    if($pass == $userObj['password']) { 
     return true; 
    } else { 
     return false; 
    } 
    $this->close(); 
} 

Je sais que le code mysql_ est démodées, Cependant, quand j'essaie d'utiliser PDO, il y a des erreurs, je pense que c'est lié au composant ou quelque chose.

Nous vous remercions de votre aide.

EDIT: Changé la fonction de pur AOP, et est ici une image de la grille de sorte que vous voyez que les mots de passe sont stockés sous forme d'un hachage, et, à moins que modifié, doit être transmis au script de mise à jour comme un match à ce qui est dans la base de données.

http://www.bolinconstruction.com/timeclock/datagrid.png

+0

Quelles sont les erreurs? Je ne peux pas fournir beaucoup d'aide si vous ne pouvez pas nous donner un indice. – Brad

+0

Duh, désolé. Le code ne montre jamais que les mots de passe correspondent, et renvoie plutôt le mot de passe md5() à la place, ce qui rend impossible la connexion d'un utilisateur si j'ai modifié les détails. – FireCrakcer37

+0

ne comparez-vous pas le mot de passe en clair à partir d'un formulaire avec md5 stocké en db? –

Répondre

0

La réponse était en fait simple après y avoir réfléchi. Dans le code initial, j'ai interrogé la base de données pour le mot de passe du nom d'utilisateur qui a été soumis avec le formulaire. Si le nom d'utilisateur a été changé, alors bien sûr la requête échouera et changera le mot de passe. En le configurant pour interroger la base de données en fonction de l'ID, le problème semble s'être corrigé. Merci à tous pour votre aide, je n'aurais jamais compris ça sans vous.

1

Dans votre fonction validatePass(), vous devez hachage du mot de passe avant de comparer

if(md5($pass) == $userObj['password']) { 
    return true; 
} else { 
    return false; 
} 

Vous pouvez faire la même chose dans votre requête

select id 
from from us_users 
where username = :username and password = :password 

puis

$result->execute(array(':username' => $username, ':password' => md5($password))); 

et tester le nombre de lignes> 0.

+0

Le mot de passe est déjà un Hash, sauf s'il a été modifié dans le formulaire. Fondamentalement, à moins que je change le champ de mot de passe sur le formulaire, il renvoie la même valeur qu'il a tiré de la base de données en premier lieu. En utilisant le firbug, j'ai déterminé que c'était vrai; Cependant, il change toujours le mot de passe à chaque mise à jour. – FireCrakcer37

+0

Faire confiance à un hachage md5 provenant d'Internet équivaut à stocker des mots de passe non hachés dans la base de données. –

Questions connexes