不匹配md5密码

时间:2012-11-17 15:07:27

标签: php mysql

我正在使用jQuery datagrid插件来创建一个简单的工具来编辑站点管理区域中的用户表。我在用户注册时将密码存储为md5()。当我尝试更新表时,它正在重新密码,从而使其无法使用。我已经尝试了几种验证密码的方法与数据库中的密码相同,但它们似乎都没有工作。

这是我的更新代码:

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
));
?> 

我的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();
}

我知道mysql_代码已过时,但是,当我尝试使用PDO时会抛出错误,我认为它与组件有关。

感谢您提供任何帮助。

编辑:将函数更改为纯PDO,这里是数据网格的图像,因此您可以看到密码存储为哈希值,除非更改,否则应传递给更新脚本与数据库中的内容匹配。

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

2 个答案:

答案 0 :(得分:1)

validatePass()功能中,您必须在比较之前散列密码

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

您可以在查询中执行相同的操作

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

然后

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

并测试行数&gt; 0

答案 1 :(得分:0)

在我思考之后,答案实际上很简单。在初始代码中,我在数据库中查询随表单提交的用户名的密码。如果用户名已更改,那么查询当然会失败,从而更改密码。通过将其设置为基于ID轮询数据库,问题似乎已得到纠正。谢谢大家的帮助,如果没有你们,我绝不会想到这一点。