2013-05-15 3 views
1

Я хочу изменить свои регистрационные/логин-страницы с md5 на bcrypt. Регистрирующая часть - все в порядке, но я не могу заставить часть входа работать хорошо. Я пытаюсь работать с библиотекой bcrypt; https://github.com/ircmaxell/password_compat/blob/master/lib/password.php.Как с помощью bcrypt

Оригинальная функция входа (без md5) выглядит следующим образом;

function login($username, $password) { 
    $user_id = user_id_from_username($username); 

    $username = sanitize($username); 

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

То, что я пытаюсь сделать, это получить базу данных, но с оригиналом код не представляется возможным из-за mysql_result части. Я подумал, например, что;

function login($username, $password) { 

    $username = sanitize($username); 

    $user_query = mysql_query("SELECT `password` FROM `users` WHERE `username` = '$username'"); 

    $row = mysql_fetch_assoc($user_query); 

    $hash = $row['password']; 

    password_verify($password, $hash); 
} 

будет решать эту проблему, но это не так.

Есть ли решение без mysql_fetch_assoc() здесь или я пытаюсь удалить базу данных неправильно?

+3

Не используйте 'mysql_ *' функции, они устарели. Вместо этого используйте 'mysqli_ *' или 'PDO'. –

+0

Почему bcrypt вместо более современной хэш-функции вроде sha2-512? – dtech

+0

Если бы я мог -1 dtech, я бы ... Посмотрите на это: http://passwords12.at.ifi.uio.no/Jeremi_Gosney_Password_Cracking_HPC_Passwords12.pdf –

ответ

1

Вам нужно настроить password_verify так:

function login($username, $password) { 
    $sql = "SELECT * FROM users WHERE username = :username"; // Select all info related to the USERNAME 
    $loginQ = $dbh->prepare($sql); // Prepare your query 
    $loginQ->bindParam(':username', $username); // Bind your variable 
    $loginQ->execute(); // Execute (TRUE or FALSE) 

    if ($loginQ) { // If TRUE 
     if ($loginQ->rowCount() == 1) { // You should only be returning 1 row with 1 username 
      $row = $loginQ->fetch(); // Fetch that row 
      $hash = $row['password']; // Use the row password and assign it to a variable 

      if (password_verify($password, $hash)) { // use passwd_compat function password_verify to check if it passes, if it does return TRUE 
       return TRUE; 
      } 
     } 
    } 
} 

Просто от чтения код вопрос, который я первый заметил, что вы не возвращает значение, будь то

ИСТИНА

или

FALSE

также другой способ, чтобы понять, как использовать password_verify вы также можете сделать это следующим образом:

if (password_verify($form_password, $row['password'])) { 
    $_SESSION['LoggedIn'] = TRUE; 
    header("location: homepage.php"); 
} else { 
    Echo "Wrong password or username please <a href='index.php'><b>Retry!</b></a>"; 
} 

и следующий вопрос, который я заметил, что вы используете небезопасные и старые функции (mysql_)

Чтобы помочь вам в решении вышеперечисленных вопросов, я сделал для вас версию PDO, в которой есть еще много положительных результатов, чем mysql_.

Затем, чтобы настроить PDO, посмотрите на это answer (да, это мое - там много хороших ответов, так что сделайте некоторое исследование). Это дает вам шаги по настройке экземпляра PDO для его фактического использования. Любые вопросы просто спрашивают. Подробнее о PDO here.

+0

+1 для использования PDO в этом примере. – tadman

+0

Могу ли я использовать PDO, OOP и традиционный PHP вместе? – Robske

+0

PDO в стиле OO и обычный стиль PHP отлично совместимы. – tadman

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