2015-02-20 1 views
1

Я создаю мой смены пароля сайта на мой сайт и у меня есть некоторые проблемы с кодом ...PHP склепа(), UPDATE и Сравнения

По какой-то причине у меня есть трудности с паролями сравниваемых и заменены db после их шифрования.

Я хотел это:

Либо получить пароль текущих пользователей и сравнить его с входным значением $ oldpass или сравнить входное значение $ oldpass с паролем, сохраненным в базе данных для текущего пользователя.

После проверки того, соответствуют ли $ oldpass и пароль из базы данных, и если они совпадают, введите входное значение $ newpass и $ repeatpass, сравните их и если они совпадут, тогда crypt() $ newpass и обновите базу данных с новым паролем.

Я даже не уверен, что пароли даже шифруются.

Также в коде я сравниваю $ oldpass с $ _SESSION ['password'], который не является паролем из db, я не могу понять, как вызвать пароль из db.

<?php 

include 'check_login_status.php'; 

$u=""; 
$oldpass=md5($_POST['oldpass']); 
//stripping both strings of white spaces 
$newpass = preg_replace('#[^a-z0-9]#i', '', $_POST['newpass']); 
$repeatpass = preg_replace('#[^a-z0-9]#i', '', $_POST['repeatpass']); 

//get the username from the header 
if(isset($_GET["u"])){ 
    $u = preg_replace('#[^a-z0-9]#i', '', $_GET['u']); 
} else { 
    header("location: compare_pass.php?u=".$_SESSION["username"]); 
    exit(); 
} 

// Select the member from the users table 
$sql = "SELECT password FROM users WHERE username='$u' LIMIT 1"; 
mysqli_query($db_conx, $sql); 
$user_query = mysqli_query($db_conx, $sql); 
// Now make sure that user exists in the table 
$numrows = mysqli_num_rows($user_query); 
if($numrows < 1){ 
    echo "That user does not exist or is not yet activated, press back"; 
    exit(); 
} 

if ($oldpass == $_SESSION['password']) { 
    echo "session and oldpass are matching"; 
} else { 
    echo "Session and oldpass do not match!"; 
} 

$isOwner = "no"; 
//check if user is logged in owner of account 
if($u == $log_username && $user_ok == true){ 
    $isOwner = "yes"; 
} 
$newpass = password_hash($newpass, PASSWORD_BCRYPT); 

if (isset($_POST["submit"]) && ($isOwner == "yes") && ($user_ok == true) && ($newpass == $repeatpass)) { 
    $newpass = password_hash($newpass, PASSWORD_BCRYPT); 
    $sql = "UPDATE users SET `password`='$newpass' WHERE username='$u' LIMIT 1"; 
} 

if (mysqli_query($db_conx, $sql)) { 
    echo "Record updated successfully"; 

} else { 
    echo "Error updating record: " . mysqli_error($db_conx); 
    } 

?> 

<h3>Create new password</h3> 
    <form action="" method="post"> 
    <div>Current Password</div> 
    <input type="text" class="form-control" id="password" name="oldpass" ><?php echo "{$oldpass}"; ?> 
    <div>New Password</div> 
    <input type="text" class="form-control" id="password" name="newpass" ><?php echo "{$newpass}"; ?> 
    <div>Repeat Password</div> 
    <input type="text" class="form-control" id="password" name="repeatpass" ><?php echo "{$repeatpass}"; ?> 
    <br /><br /> 
    <input type="submit" name="submit" value="Submit"> 
    <p id="status" ></p> 
    </form><?php echo "{$oldpass}, {$_SESSION['password']}"; ?> 


    <pre> 
    <?php 
    var_dump($_SESSION); 
    var_dump($oldpass); 

    var_dump($newpass); 
    var_dump($repeatpass); 
    ?> 
    </pre> 
+0

Какая у вас версия php? – Mihai

+0

Моя версия PHP - 5.6.3. – EntangledQuantum

+0

Вы усложняете себя, по какой-либо причине вы не используете функцию хэширования по умолчанию в php> 5.5? https://php.net/manual/ro/function.password-hash.php – Mihai

ответ

0

Ther является гораздо более простой способ решить эту проблему:

// Hash a new password for storing in the database. 
// The function automatically generates a cryptographically safe salt. 
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT); 

// Check if the hash of the entered login password, matches the stored hash. 
// The salt and the cost factor will be extracted from $existingHashFromDb. 
$isPasswordCorrect = password_verify($password, $existingHashFromDb); 

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

Хранение пароля/хэша в сеансе не очень полезно, если вы знаете, что это тот же пользователь, вы знаете, что он уже зарегистрирован, просто сохраните индикатор в сеансе, например $ _SESSION ['is_logged_in'] или просто имя пользователя $ _SESSION ['username'].

+0

Теперь функция криптографии работает. Но я все еще пытаюсь понять, почему мой код не получает пароль, который уже хранится в db, я не знаю, с каким именем я должен его назвать. Спасибо за вашу помощь! – EntangledQuantum

+0

@EntangledQuantum - Вы ничего не сделали с результатом вашего запроса, пароль должен быть частью результата, например '$ user_query-> password'. – martinstoeckli

+0

ok Я экспериментирую с запросом, но он не работает, я делаю что-то неправильно. Что я должен был написать? – EntangledQuantum

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