2015-04-29 1 views
2

У меня есть форма регистрации, которая создает профиль и страницу «Редактировать профиль», которая позволяет пользователю изменять информацию до тех пор, пока они также вводят свой пароль.При проверке пароля он заботится только о первых 8 символах

Проблема заключается в том, что страница «Редактировать профиль» обеспечивает только совпадение первых 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)); 

Цель «хэш» переменной не имеет никакого отношения к паролю, поэтому игнорируйте это.

И вот код для кода «Редактировать профиль».

$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() и работал аналогичным образом.

Большое спасибо!

+1

Вы пробовали печатать строки, чтобы вы знали, появилось ли всего 8 символов? Также каков тип поля пароля? –

+2

PHP предоставляет функцию специально для хэширования паролей: password_hash() –

+3

http://stackoverflow.com/a/29778421/ –

ответ

2

От: http://php.net/manual/en/function.crypt.php

Стандартной DES на основе крипты() возвращает соль в качестве первых двух символов на выходе. Он также использует только первые восемь символов из str, поэтому более длинные строки, начинающиеся с тех же восьми символов, будут генерировать тот же результат (при использовании той же соли).

Вы должны попробовать другой алгоритм, чтобы получить хэш. Вы можете найти различные примеры в ссылке.

Пожелайте, если это поможет!

+1

Большое спасибо! Я буду использовать одну из других функций хэширования. –

+0

@ user3798761 - Функция [password_hash()] (http://www.php.net/manual/en/function.password-hash.php) - это действительно путь. – martinstoeckli

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

  • Нет связанных вопросов^_^