2012-06-06 2 views
0

Таким образом, я создаю форму для входа. Предоставление пользователю входных данных, чтобы проверить правильность формата электронной почты и пароль длиннее 6 символов, если они действительны, тогда проверьте, соответствуют ли учетные данные входа действительны, и они совпадают с электронной почтой/паролем, хранящимся в таблице пользователей. В регистрационной форме я шифрую пароль, используя sha1 и данную соль. Когда я проверю правильность пароля , я пишу одну и ту же проверку, но хотя я ввожу правильные логин учетные данные, кажется, невозможно проверить логин. Так вот мой код: Пользователь функция Логин:mysqli, sha1/salt password valid check

function user_login($email, $password){ 
    global $db; 
    $salt='%#@#@**#_-!'; 
    $userid = id_from_email($email); 
    $email = sanitize($email); 
    $password = sha1($password.$salt); 
    $query="SELECT UserId FROM users WHERE Email= '".$email."' and UserPass= '".$password."' "; 
    $result=$db->query($query); 
    $valid = $result->num_rows; 
    return ($valid >1) ? $userid : false; 
} 

А вот часть login.php, которая проверяет, является ли Войти правомерен:

else if(empty($errors) == true) { 
     $userlogin=user_login($email, $password); 
     if ($userlogin==false){ 
     $errors[]='Wrong email/password combination.'; 
     } else { 
     //set the user session 
     session_start(); 
     $_SESSION['UserId']=$userlogin; 
     header('Location:success.php'); 
     } 

Независимо от того, если я ставлю правильный пароль и Эл. адрес. Она всегда выдает «комбинацию Неправильный адрес электронной почты/пароль» А вот как я храню пропуск в базе данных на register.php

$salt='%#@#@**#_-!'; 
$password = sha1($password.$salt); 

Я был бы очень признателен, если вы могли бы помочь мне.

Thankyou.

+0

Не по теме: пароль соль всегда должна быть случайной; цель соли состоит в том, чтобы иметь разные хэши для одного и того же пароля, поэтому, если одна учетная запись имеет скомпрометированный пароль, другие учетные записи с тем же паролем будут иметь другой хеш и не будут отличаться от того, что они имеют одинаковый пароль. Кроме того, 'sha1()' не является хорошим алгоритмом хэширования паролей, в идеале вы хотите использовать ** очень медленный алгоритм хэширования, так что принудительное принудительное переключение займет некоторое время. – lanzz

+0

Если пароль скомпрометирован, тот же пароль будет работать и для других учетных записей с одинаковым паролем, независимо от того, сколько соли вы добавляете. Я думаю, соль для их нападающих, которые получают доступ к базе данных. Без соли они могли бы просто заменить хэш в таблице и получить доступ к веб-сайту со своим собственным паролем. Теперь они должны угадать соль (или посмотреть ее здесь на stackoverflow: p) ... –

+0

@WouterH Да, это сработает, но вы не сможете понять, какие учетные записи используют один и тот же пароль. Если вам удастся получить хешированные пароли, было бы очевидно, какие из них используют один и тот же пароль, если они несолены. – lanzz

ответ

1

То, что вы действительно хотите это:

return ($valid >= 1) ? $userid : false; 

вместо

return ($valid > 1) ? $userid : false; 

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

И я предпочел бы это:

return ($valid == 1) ? $userid : false; 
+0

Спасибо. Глупая ошибка ... Так что теперь это работает, я помню, что значение $ valid == 1, но не знаю, почему я его изменил. Спасибо, что работает сейчас. – inrob

+0

Если бы я использовал $ valid == 1, то я должен изменить запрос, чтобы получить это значение и сравнить его. В настоящий момент запрос возвращает количество строк, а не значение строки. – inrob

+0

Вы должны использовать $ valid == 1, потому что хотите быть уверенным, что только 1 строка (так один пользователь) соответствует учетным данным. Если есть 2 или более пользователей, которые соответствуют одним и тем же учетным данным, происходит что-то подозрительное. –

1

Изменить вызов к базе данных с соответствующей переменной электронной почты:

$query="SELECT UserId FROM users WHERE Email= '".$useremail."' and UserPass= '".$password."' "; 
+0

Привет, Ян. На самом деле я изменил адрес электронной почты, чтобы просто пропустить чтение людей. Но у меня такие же значения. Спасибо в любом случае :) – inrob

+0

Пожалуйста, сделайте 'var_dump ($ email);', 'var_dump ($ password);' после строки '$ password = sha1 ($ password. $ Salt);' и разместите здесь значения. –

+0

Я добавил эти две строки, но когда я ввел правильный адрес электронной почты/пропущен, он все еще говорит «неправильный пароль электронной почты» и еще одну строку: строка (18) строка «[email protected]» (40) «01f5a00b09702f0be2850123c49e69650c9937cc» – inrob

0

Вы выбираете UserId из базы данных, но никогда не использовать этот результат; ваша функция user_login() возвращает результат id_from_email($email), а не идентификатор, полученный от базы данных. Проверьте возвращаемое значение id_from_email(), или еще лучше - верните идентификатор из запроса базы данных.

+0

Итак, re предлагая мне сделать что-то вроде: $ row = $ result-> fetch_assoc(); $ userid = $ row ['UserId']; , а затем вернуть $ userid? :) – inrob

+0

Да, это именно то, что я предлагаю. Если столбец 'UserId' вашей базы данных не имеет ничего общего с идентификаторами ваших пользователей, что я считаю маловероятным. – lanzz

+0

Да, это имеет смысл. На самом деле я не знаю, почему я имел в виду, когда создал функцию id_from_username .... СПАСИБО ЗА ВАШЕ ПРЕДЛОЖЕНИЕ. – inrob

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