2015-04-14 3 views
1

Я пытаюсь создать систему регистрации и регистрации для своего веб-сайта, однако я бы хотел использовать более безопасный метод шифрования паролей, чем md5, но у меня возникают проблемы.Проблемы с расширением пароля PHP

function register_user($register_data) { 
array_walk($register_data, 'array_sanitize'); 
$register_data['password'] = password_hash($register_data['password'], PASSWORD_BCRYPT, ['cost' => 10]); 

$fields = '`' . implode('`, `', array_keys($register_data)) . '`'; 
$data = '\'' . implode('\', \'', $register_data) . '\''; 

mysql_query("INSERT INTO `users` ($fields) VALUES ($data)"); 
email($register_data['email'], 'Activate your account', " 
Hello " . $register_data['first_name'] . ",\n\nYou need to activate your account, so use the link below:\n\nhttp://thepuzzler.net/activate.php?email=" . $register_data['email'] . "&email_code=" . $register_data['email_code'] . " \n\n -ThePuzzler");  } 

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

function login($username, $password) { 

$user_id = user_id_from_username($username); 
$username = sanitize($username); 
$password = password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]); 

return (mysql_result(mysql_query("SELECT COUNT(`user_id`) FROM `users` WHERE `username` = '$username' AND `password` = '$password'"), 0) == 1) ? $user_id : false;  } 

Это моя система входа и когда я пытаюсь войти, Принести моя ошибка имя пользователя или пароль неверен. Это связано с тем, что я считаю, что зашифрованные пароли не совпадают. Поэтому я думаю, что это связано с линией, где я создаю переменную $password и шифрую ее.

Также в моей базе данных находится столбец пароля varchar (64). Спасибо за помощь.

ответ

1

Функция password_hash() генерирует индивидуальную соль для каждого вызова. Чтобы проверить пароль, вам понадобится функция password_verify().

Поэтому вам необходимо получить хэш-код пароля из базы данных и передать его вместе с введенным паролем password_verify().

Edit: Как это:

function login($username, $password) { 
    $usernameForDb = mysql_real_escape_string($username); 
    $hashFromDb = mysql_result(mysql_query("SELECT password FROM users WHERE username = '$usernameForDb'")); 
    $isValid = password_verify($password, $hashFromDb); 
    if ($isValid) { 
     // user is accepted, get userID 
     return user_id_from_username($username); 
    } 
    return false; 
} 
+0

Я понимаю, что вы говорите, но password_verify() возвращает логическое значение, так что я не знаю, как вы можете иметь логическое значение равно пароль в базе данных. –

+0

$ hashFromDb = mysql_result (mysql_query ("SELECT password FROM users WHERE username = '$ username'")); $ isValid = password_verify ($ passwordEnteredByUser, $ hashFromDb); if ($ isValid) {// пользователь принят, get userID} – MarcusSchwarz

+0

Этот код является уязвимым для SQL-инъекции. –

Смежные вопросы