проверка пользователя / обновление таблицы - PullRequest
0 голосов
/ 03 февраля 2011

У меня есть простая структура сброса пароля для пользователей, чтобы обновить свои существующие пароли в случае потери. Пользователь переходит по ссылке, где он вводит свою электронную почту, токен создается и сохраняется в назначенной таблице для пользователя с забытым паролем. Пользователю отправляется электронное письмо со ссылкой, к которой прикреплен токен. Когда пользователь нажимает на эту ссылку, он переходит на страницу для сброса пароля. Если токен, хранящийся в БД, совпадает с токеном в $_GET, я разрешаю им сбросить пароль. простой.

Проблема в том, что я не могу обновить их конкретную строку в БД. Я пытаюсь идентифицировать их, проверяя их электронную почту, которую они ввели против своей электронной почты в БД. Я могу обновить строку пароля ВСЕХ таблиц, но при указании одного пользователя происходит сбой.

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 ]

2 голосов
/ 03 февраля 2011

Почему бы вам не сохранить идентификатор пользователя в таблице Password_Reset, а затем обновить пользователя на основе этого идентификатора, а не пытаться сопоставить его с электронной почтой.пользователи, отправляющие электронные письма, должны точно соответствовать регистру электронной почты в запросе.Вы можете указать адрес электронной почты строчными буквами, но это технически неверно.

$query = "
    SELECT *
    FROM `Password_Reset`
    WHERE `token` = '".$token."' AND LOWER(`email`) = LOWER('".$user_email."')
";
1 голос
/ 03 февраля 2011
 if($_GET['token'] == $token) {
        header("Location: index.php");
        exit;

Должно быть != Полагаю. Вам нужно проверить, не равен ли токен токену в БД. Не так ли?

1 голос
/ 03 февраля 2011

Похоже, у вас есть $user_email в вашем первом запросе, но он еще не установлен, потому что вы устанавливаете его с результатом первого запроса. Если вы не имеете в виду $_POST['user_email']?

Было бы НАМНОГО проще и безопаснее использовать user_id и отправлять пользователю токен, только если он действительно есть в вашей системе (похоже, вы отправляете всем токен!)

Ваш токен должен быть уникальным. Похоже, это совершенно случайно. Хороший способ создать токен - создать случайную строку + нечто, уникально идентифицирующее пользователя (например, его имя пользователя или адрес электронной почты), а затем использовать MD5 или аналогичную функцию для хеширования. Он достаточно безопасен и идентифицирует самого пользователя, поэтому вы можете искать его только по токену.

1 голос
/ 03 февраля 2011

Похоже, что вы не написали заглавными буквами $ _POST ['Password']

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

На основе вашего другого кода оно должно быть:

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

Также в вашем SELECT, у вас есть email и в вашем ОБНОВЛЕНИИ вы используете Email. MySQL чувствителен к регистру по умолчанию на платформах, отличных от Windows.

...