У меня есть форма регистрации, которая создает профиль, и страница «Редактировать профиль», которая позволяет пользователю изменять информацию, если он также вводит свой пароль.
Проблема в том, что страница «Редактировать профиль» обеспечивает только соответствие первых 8 символов пароля. Или, на самом деле, я думаю, что лучшим описанием будет то, что функция crypt () кодирует только первые 8 символов.
Вот мой код для формы регистрации:
$password = $_REQUEST['password'];
// Checks to make sure that the password isn't blank
if (!$password) {
handle_error("You have left the password field blank.", "Blank Password");
//handle_error() is a custom function
}
И вот мой код для вставки этого в базу данных MySQL:
$insert_sql = sprintf("INSERT INTO users (first_name, last_name, pen_name, website, password, email, user_bio, user_reason, hash, profile_pic) " .
"VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s');",
mysql_real_escape_string($first_name),
mysql_real_escape_string($last_name),
mysql_real_escape_string($pen_name),
mysql_real_escape_string($website),
mysql_real_escape_string(crypt($password, $email)),
mysql_real_escape_string($email),
mysql_real_escape_string($bio),
mysql_real_escape_string($reason),
mysql_real_escape_string($hash),
mysql_real_escape_string($upload_filename));
Назначение переменной hash не имеет ничего общего с паролем, поэтому игнорируйте это.
А вот код для кода «Редактировать профиль».
$password_query = "SELECT * FROM users WHERE user_id = " . $user_id;
$password_query_run = mysql_query($password_query);
$password_array = mysql_fetch_array($password_query_run);
$password_old_hash = $password_array['password'];
$password_new_hash = crypt($password, $email);
if(!($password_new_hash === $password_old_hash)) {
handle_error("The Password you entered does match what we have in our system.","Wrong Password.");
}
Я относительно новичок в PHP, но я сам написал весь этот код, поэтому, если кому-то понадобятся какие-либо пояснения, я с удовольствием объясню сам.
Как я уже сказал, проблема в том, что мои страницы заботятся только о первых 8 символах пароля. Когда я пытаюсь проверить «Редактировать профиль» с неверным паролем, выдает ошибку. Если я оставлю пароль пустым, он выдаст ошибку. Но если я правильно наберу первые 8 символов, а затем кучу бреда, он примет пароль! Я не уверен, есть ли какая-то функция crypt () или строки, которые я не получаю.
Да, и я делаю (! ($ String1 === $ string2)), но я пробовал функцию strcomp (), и это работало так же.
Спасибо!
От: http://php.net/manual/en/function.crypt.php
Стандартный основанный на DES crypt () возвращает соль как первые два
символы вывода. Он также использует только первые восемь символов
str, поэтому более длинные строки начинаются с тех же восьми символов
будет генерировать тот же результат (когда используется та же соль).
Вы должны попробовать другой алгоритм, чтобы получить хеш. Вы можете найти различные примеры в ссылке.
Жаль, что это помогает!
Других решений пока нет …