验证用户/更新表

时间:2011-02-03 19:39:09

标签: php mysql html passwords reset

我有简单的重置密码结构,供用户在丢失时更新现有密码。用户进入他们输入电子邮件的链接,创建令牌并将其存储在具有忘记密码的用户的指定表中。向用户发送一封电子邮件,其中包含附加了令牌的链接,当他们点击该链接时,会将他们带到页面以重置其密码。如果存储在数据库中的令牌与$_GET中的令牌匹配,我允许他们重置密码。简单。

问题是我无法更新数据库中的特定行。我试图通过检查他们在数据库中针对他们的电子邮件输入的电子邮件来识别它们。我能够更新WHOLE表密码行,但是当指定一个用户时,它会失败。

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

    $query = "SELECT * FROM `Password_Reset` WHERE `token` = '".$token."' AND `email` = '".$user_email."'";
    $request = mysql_query($query,$connection) or die(mysql_error());
    $result = mysql_fetch_array($request);

    $token = $result['token'];
    $alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcedfghijklmnopqrstuvwxyz1234567890";
    $rand = str_shuffle($alpha);
    $salt = substr($rand,0,40);
    $hashed_password = sha1($salt . $_POST['password']);
    $user_email = $result['email'];



    if($_GET['token'] == $token) {
        header("Location: index.php");
        exit;

    }else{

    if(empty($_POST['Password'])) {
        $valid = false;
        $error_msgs[] = 'Whoops! You must enter a password.';
    }

    if($_POST['Password'] != $_POST['passwordConfirm'] || empty($_POST['Password'])) {
        $valid = false;
        $error_msgs[] = "Your password entries didn't match...was there a typo?";
    }

    if($valid) {
        $query = "UPDATE `Users` SET `encrypted_password` = '$hashed_password' WHERE `Email` = '$user_email'";

        mysql_query($query,$connection);
    }


    }
}

非常感谢

4 个答案:

答案 0 :(得分:2)

为什么不将用户ID存储在Password_Reset表中,然后根据id更新用户,而不是尝试匹配电子邮件。

请注意,如果您尝试匹配用户电子邮件,则电子邮件大小写必须与查询中的“=”完全匹配。您可以小写电子邮件地址,但这在技术上是不正确的。

$query = "
    SELECT *
    FROM `Password_Reset`
    WHERE `token` = '".$token."' AND LOWER(`email`) = LOWER('".$user_email."')
";

答案 1 :(得分:1)

看起来你没有大写$ _POST ['密码']

$hashed_password = sha1($salt . $_POST['password']);

根据您的其他代码,它应该是:

$hashed_password = sha1($salt . $_POST['Password']);

同样在你的SELECT中,你有email,在你的更新中你使用Email.默认情况下,MySQL在非Windows平台上是区分大小写的。

答案 2 :(得分:1)

您的第一个查询中似乎有$user_email,但尚未设置,因为您使用第一个查询的结果进行设置。除非你的意思是$_POST['user_email']

使用user_id会更容易,更安全,只有当用户真正在你的系统中时才会向用户发送一个令牌(看起来你正在向每个人发送令牌!)

您的令牌应该是唯一的。看起来它完全是随机的。制作令牌的好方法是创建一个随机字符串+唯一标识用户的内容(例如用户名或电子邮件),然后使用MD5或类似函数对其进行哈希处理。它是相当安全的,它可以自己识别用户,因此您只能通过令牌查找它们。

答案 3 :(得分:1)

 if($_GET['token'] == $token) {
        header("Location: index.php");
        exit;

我想应该是!=。 您需要检查令牌是否与令牌不等于db。不是吗?