Изменить и подтвердить пароль MySql PHP - PullRequest
0 голосов
/ 28 января 2019

так что у меня есть страница, где пользователи могут менять пароль, но я хочу сделать его более безопасным, спрашивая у пользователя старый пароль, а затем новый, я просто не знаю, как проверить, может ли кто-нибудь помочьменя, пожалуйста?
Вот мой фактический код:

    <?php
//Inicio de uma session que autentica e valida o login feito em login.php
  session_start(); 
  //Redirecionar um Admin ou um SuperAdmin para a devida página com as devidas permissões! 
include '../functions/redirect.php';
 isAuthenticated();
 $user = $_SESSION['users']['username'];

?>
<!DOCTYPE html>
<?php

    require '../functions/database.php';

    if ( !empty($_POST)) {
        // Manter a validação dos erros
        $usernameError = null;
        $passwordError = null;

        $password = $_POST['password'];
        // $confirm_password = null;
        // $new_password = null;

        // Validar os inputs
        $valid = true;

          if (empty($password)) {
            $passwordError = 'Introduza a password!';
            $valid = false;
        }

        // Inserir os dados
     if ($valid) {
            $pdo = Database::connect();
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $password = password_hash($password, PASSWORD_BCRYPT);
            $sql = "UPDATE users SET password = ? WHERE username = '$user'";
            $q = $pdo->prepare($sql); 
            $q->execute(array($password)); 
            header("Location: index.php");
            Database::disconnect();
    }

 }

?>

Ответы [ 3 ]

0 голосов
/ 28 января 2019

Я бы также отметил, что $ valid = true после отправки $ _POST не имеет смысла, потому что вы делаете $ valid true путем отправки $ _POST, где он принимает любой ввод, независимо от того, что он есть, пока что-то есть и длядля обновления пароля вам действительно нужны все данные.Затем вы проверяете дополнительные требования и затем меняете $ valid на false.

Вы должны начать с $ valid = false, а когда требования будут выполнены, вы можете вернуть его как True.

Также, чтобы добавить к ответу Дерека, я предлагаю вам сделать небольшую дополнительную проверку, чтобы убедиться, что пользовательдолжен дважды проверить новый пароль, чтобы избежать ситуации, когда они делают ошибку и позже не могут войти из-за этого.

0 голосов
/ 28 января 2019

Для этого вам нужно обработать в 2 раза:

В первый раз вы должны получить текущий пароль пользователя.Чтобы проверить его идентификатор:

$password = $_POST['password'];
if (password_verify($password, $remote->password))
   // the password is right

-> remote является результатом запроса sql

Затем во второй раз вы сравните новый пароль и подтверждение этого пароля,Если они одинаковы:

$new = $_POST['new_password'];
$confirm = $_POST['confirm'];
if ($new == $confirm)
   $new = password_hash($new, PASSWORD_BCRYPT);
   // execute your sql insertion

Пожалуйста, извините, мой английский

0 голосов
/ 28 января 2019

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

ПРИМЕЧАНИЕ использование фильтра, очищающего информацию, введенную в форму, перед передачей ее в SQL-запрос.

Если все хорошо, тогда вы продолжаете и проверяете новый пароль, введенный так, как вы хотите,Если новый пароль подтвержден, тогда вы продолжаете и обновляете свою таблицу пользователей.

// Connect to database
$pdo = Database::connect();
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$valid = false;
if ( !empty($_POST)) {
    // Manter a validação dos erros
    $usernameError = null;
    $passwordError = null;

    // Read in old password from form field
    $old_password = filter_var($_POST['old_password'], FILTER_SANITIZE_STRING);

    // Validar os inputs
    if (empty($old_password)) {
        $passwordError = 'Introduza a password!';
        $valid = false;
    }

    // Check old password
    else {
        // Read in old password from db            
        // build SELECT statement with variable
        $sql = 'SELECT password FROM users WHERE username = :USER';
        $sql->bindValue(':USER', $user);
        $sql->execute();

        if ($sql->rowCount() > 0) {
            // Read in value from select
            $row = $sql->fetchObject();
            $user_password = $row->password;

            // Test entered password against hashed current user password
            if (password_verify($old_password, $user_password)) {
                $valid = true;
            }

            else {
                // passwords do not match
                $valid = false
            }
        }
        else {
            // Did not find user in table
            $valid = false;
        }
    }
}

// Inserir os dados
 if ($valid) {
    // Test new password
    $new_password = filter_var($_POST['new_password'], FILTER_SANITIZE_STRING);

    // here you would test length, or content or whatever ...

    // if still valid you save the new password
    $new_password = password_hash($new_password, PASSWORD_BCRYPT);
    $sql = "UPDATE users SET password = :NEWPASSWORD WHERE username = :USER';
    $sql->bindValue(':NEWPASSWORD', $new_password);
    $sql->bindValue(':USER', $user);
    $sql->execute();

    // header("Location: index.php");
}

Database::disconnect();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...