2014-10-29 6 views
0

Хорошо, так как в качестве побочного проекта для моего образования я в настоящее время работает над безопасной системой входа в систему с использованием PHP и mysqli. Это идет гладко, но теперь я столкнулся с проблемой, с которой мои сверстники, учителя и я сбиты с толку.Обновление поля проверяет пароль?

Я хеширую и проверяю свои пароли через password_hash и password_verify.

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

Теперь вот кикер: Когда я перехожу в PHPMyAdmin, скопируйте хешированный пароль, хранящийся в базе данных, и обновите поле пароля с помощью этого скопированного пароля ... он работает. Я могу войти в систему по своему усмотрению, используя пароль, который я использовал, и он не даст мне никаких ошибок.

У кого-нибудь есть идея, что случилось, и как это исправить?

Код, используемый для регистрации:

public function createAccount() 
{ 
    global $con; 

    $this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n"; 
    $sql='INSERT into user (username, password, email, creation_date) 
     VALUES (?,?,?,?)'; 

    // Prepare statement 
    $stmt = $con->prepare($sql); 
    if($stmt === false) { 
     trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR); 
    } 

    // Bind parameters. Types: s = string, i = integer, d = double, b = blob 
    $stmt->bind_param('ssss',$this->username,$this->password,$this->email,$this->creationDate); 

    // Execute statement 
    $stmt->execute(); 

    echo $stmt->insert_id; 
    echo $stmt->affected_rows; 

    $stmt->close(); 

    $_SESSION['login'] = true; 
    $_SESSION['username'] = $username; 
    Header("Location: index.php"); 
} 

Код, используемый для проверки полномочий:

public function fetchCredentials() { 
    // Select a set of credentials from the username given in form and return as array 
    global $con; 
    $sql = 'SELECT id, password FROM user WHERE username = ?'; 

    // Prepare statement 
    $stmt = $con->prepare($sql); 
    if($stmt === false) { 
     trigger_error('Wrong SQL: ' . $sql . ' Error: ' . $con->error, E_USER_ERROR); 
    } 

    // Bind parameters. Types: s = string, i = integer, d = double, b = blob 
    $stmt->bind_param('s',$this->username); 

    // Execute statement 
    $stmt->execute(); 

    // Store all results in an array 
    $rs=$stmt->get_result(); 
    $arr = $rs->fetch_all(MYSQLI_ASSOC); 
    $stmt->close(); 

    return($arr); 
} 

public function validateCredentials() { 
    // Get credentials 
    $arr = $this->fetchCredentials(); 

    // Validate username 
    if (count($arr) > 1) { 
     $this->error = 'crit'; 
     $this->abort = true; 
    } else if (count($arr) < 1) { 
     $this->error = 'badLogin'; 
     $this->abort = true; 
    } else { 
     $arr = $arr[0]; 
    } 

    echo $arr['password'].'<br>'.$this->password; 
    // Validate password. NOTE: This is where the issue arises. Password_verify() will return false where it should return true. 
    if ($this->abort == false && !password_verify($this->password, $arr['password'])) { 
     $this->error = 'badLogin'; 
     $this->abort = true; 
    } 

    // Return values if needed 
    if ($this->abort == false) { 
     $this->id = $arr['id']; 
    } 
    return $this->abort; 
} 

часть, которая вызывает входа в систему: (Да, функция validatecredentials становится вызывается дважды Да, есть. есть некоторые другие вещи, которые не очень хорошо написаны. Эта часть кода по-прежнему нуждается в некоторой работе, и это первое, что я сделаю после устранения проблемы выше)

function login() 
{ 
    $newCred = new credentials(
    $_POST['username'], 
    $_POST['password']); 

    if ($newCred->checkForm() == false 
    && $newCred->validateCredentials() == false) { 
     $newLogin = new login(
     $newCred->validateCredentials()['id']); 

     $newLogin->login(); 
     $newLogin->getUserDetails(); 
    } else { 
     $newCred->fetchError(); 
    } 
} 
+2

Как вы думаете, кто может помочь вам без какой-либо одной строки вашего кода? – baao

+1

Код PLS. однако из-за опыта хешей, не позволяющих логинам правильно убедиться, что столбец таблицы БД установлен в текст или какое-то большое число, которое не собирается прерывать хэш – Typhomism

+0

Ваше сообщение начиналось с самого начала ... вы используете mysqli вместо PDO. .. Какой тип хэша вы используете? а также, пожалуйста, укажите образец кода, чтобы узнать, с чем вы имеете дело! –

ответ

1

Хорошо, всем, кто помог: Спасибо. Мне просто помог мой одноклассник, и ему удалось найти проблему. Я нахожусь прямо сейчас.

$this->password = password_hash($this->password, PASSWORD_DEFAULT)."\n"; 

Вот оно. "\ П". Новая строка. Я схватил свой код с примера, и это было по какой-то причине. Когда я обновил базу данных, новая строка была удалена.

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

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