2014-12-17 5 views
-1

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

шаг за шагом. Новый пользователь:

$userName = $_POST['txtUserName']; 
$password = $_POST['txtPassword']; 
    $sql = "INSERT INTO tbl_user (user_name, user_password, user_regdate) 
       VALUES ('$userName', PASSWORD('$password'), NOW())"; 

Это работает. Я новый пользователь хранится в базе данных

База данных: MySQL v5.6

`user_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
`user_name` varchar(20) NOT NULL DEFAULT '', 
`user_password` varchar(32) NOT NULL DEFAULT '', 

ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ; 

Так я пытаюсь войти в (от формы входа):

// if we found an error save the error message in this variable 
$errorMessage = ''; 

$userName = $_POST['txtUserName']; 
$password = $_POST['txtPassword']; 

// first, make sure the username & password are not empty 
if ($userName == '') { 
    $errorMessage = 'You must enter your User Name'; 
} else if ($password == '') { 
    $errorMessage = 'You must enter your password'; 
} else { 
    // check the database and see if the username and password combo do match 
    $sql = "SELECT user_id 
      FROM tbl_user 
       WHERE user_name = '$userName' AND user_password = PASSWORD('$password')"; 
    $result = dbQuery($sql); 
if (dbNumRows($result) == 1) { 
     $row = dbFetchAssoc($result); 
     $_SESSION['plaincart_user_id'] = $row['user_id']; 

     // log the time when the user last login 
     $sql = "UPDATE tbl_user 
       SET user_last_login = NOW() 
        WHERE user_id = '{$row['user_id']}'"; 
     dbQuery($sql); 

     // now that the user is verified we move on to the next page 
     // if the user had been in the admin pages before we move to 
     // the last page visited 
     if (isset($_SESSION['login_return_url'])) { 
      header('Location: ' . $_SESSION['login_return_url']); 
      exit; 
     } else { 
      header('Location: index.php'); 
      exit; 
     } 
    } else { 
     $errorMessage = 'Username or password wrong'; 
    }  

    } 

    return $errorMessage; 
     } 

Кажется, что Безразлично» t распознает функцию пароля(), потому что, если я пишу вручную в пароле базы данных, значение не зашифровано, оно работает ...

+2

Убедитесь, что длина вашей колонки для пароля достаточно долго. Также проверьте, все ли элементы формы содержат атрибуты имени и что сеанс действительно запущен; видя, что вы используете сеансы. Проверьте наличие ошибок со всех сторон PHP/SQL. –

+1

Из документации mysql: 'Столбец Password должен быть достаточно широким для хранения длинных хэшей (41 байт) .' – vaso123

+0

*« Кажется, что не распознает функцию пароля() »* - Это противоречит тому, что вы сказали *« Это работает. У меня есть новый пользователь, который хранится в базе данных "*. --- * "если я пишу вручную в пароле базы данных, это значение не зашифровано, оно работает." * Проверьте имена элементов формы. ** Еще лучше, разместите свою HTML-форму. ** Добавьте отчет об ошибках в начало вашего файла (ов) сразу после открытия тега

ответ

2

Вы используете ПА MySQL Функция SSWORD для использования, для которой она не предназначена. Помимо того, что это ужасная идея с точки зрения безопасности (пароли с открытым текстом могут заканчиваться в журналах), это также означает, что MySQL будет молча усекать пароль, если поле пароля недостаточно для него. Это приведет к хэшам паролей, которые никогда не будут соответствовать.

Вам необходимо изучить хеширование паролей, чтобы ваши пароли были более безопасными и менее подвержены ошибкам усечения (НЕ ИСПОЛЬЗУЙТЕ MD5 ИЛИ SHA-1 ДЛЯ ЭТОГО! Даже SHA-256 сомнительно). Вам также нужно определить, как долго будет содержать строку хеша для выбранного вами метода, и убедитесь, что поле пароля достаточно велико, чтобы принять его.

http://php.net/manual/en/book.password.php

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