javascript — ввод хэша для сброса пароля, а не фактического пароля пользователя

У меня есть страница обновления пароля, которая не позволяет мне вводить текущий текущий пароль для поля текущего пароля. Вместо этого он хочет хешированный пароль. Однако после изменения новый хэшируется, и это хорошо. Мне просто нужно иметь возможность ввести действительный пароль, а не хэшировать.

Да я знаю, нет md5; это больше для тестирования это все.

changepassword.js

<script>
function validatePassword() {
var currentPassword,newPassword,confirmPassword,output = true;

currentPassword = document.frmChange.currentPassword;
newPassword = document.frmChange.newPassword;
confirmPassword = document.frmChange.confirmPassword;

if(!currentPassword.value) {
currentPassword.focus();
document.getElementById("currentPassword").innerHTML = "required";
output = false;
}
else if(!newPassword.value) {
newPassword.focus();
document.getElementById("newPassword").innerHTML = "required";
output = false;
}
else if(!confirmPassword.value) {
confirmPassword.focus();
document.getElementById("confirmPassword").innerHTML = "required";
output = false;
}
if(newPassword.value != confirmPassword.value) {
newPassword.value="";
confirmPassword.value="";
newPassword.focus();
document.getElementById("confirmPassword").innerHTML = "not same";
output = false;
}
return output;
}
</script>

updatepassword.php

<?php
include 'core/login.php';    === this contains the connection, it's obviously good ===
include 'includes/head.php';  === changepassword.js is linked in the head ===
if(count($_POST)>0) {
$result = mysqli_query($link, "SELECT *from users WHERE id='" . $_SESSION["id"] . "'");
$row = mysqli_fetch_array($result);
if($_POST["currentPassword"] == $row["password"]) {
mysqli_query($link, "UPDATE users set `password`='" .md5(md5($_POST['newPassword'])) . "' WHERE id='" . $_SESSION["id"] . "'");
$message = "Password Changed";
} else $errormessage = "Current Password is not correct";
}
print_r($_SESSION);
?>

Форма на той же странице:

<div class="container">
<div class="text-center">
<h4>Change password below</h4>
</div><br />

<div class="message"><?php if(isset($message)) { echo $message; } ?></div>
<div class="message"><?php if(isset($errormessage)) { echo $errormessage; } ?></div>

<div class="col-md-4 col-md-offset-4">
<form name="frmChange" method="post" action="" onSubmit="return validatePassword()">

<div class="form-group">
<label>Current Password*</label>
<input type="text" name="currentPassword" class="form-control input-md" />
</div>
<div class="form-group">
<label>New Password*</label>
<input type="text" name="newPassword" class="form-control input-md" />
</div>
<div class="form-group">
<label>Confirm Password*</label>
<input type="text" name="confirmPassword" class="form-control input-md" />
</div>
<br />
<div class="text-center">
<input type="submit" name="submit" class="btn btn-success" value="Submit" /></div>
</form>
</div>
</div>

0

Решение

Я пошел за борт. Ваш другой вопрос был закрыт. Я собираюсь оставить это здесь … Я использую PHP версию PHP 5.2.0.

<?php

// so I don't actually have to test form submission, too...
$_POST['current_password'] = 'Tacotaco';
$_POST['new_password']     = 'NINrocksOMG';
$_POST['confirmPassword']  = 'NINrocksOMG';
$_SESSION['id'] = 1;

// this is Tacotaco encrypted... update your db to test
// update users set password = '$2y$10$fc48JbA0dQ5dBB8MmXjVqumph1bRB/4zBzKIFOVic9/tqoN7Ui59e' where id=1// the following is sooooo ugly... don't leave it this way

if (!isset($_SESSION['id'])            or empty($_SESSION['id']) or
!isset($_POST['current_password']) or empty($_POST['current_password']) or
!isset($_POST['new_password'])     or empty($_POST['new_password']) or
!isset($_POST['confirmPassword'])  or empty($_POST['confirmPassword']) ) {
$message = 'Please enter your password';
}
else {
$sid = $_SESSION['id'];

$currpass = $_POST['current_password'];
$newpass  = $_POST['new_password'];
$conpass  = $_POST['confirmPassword'];

$message  = validate_password($sid, $currpass, $newpass, $conpass);
}

print "<br/>$message<br/>";

function validate_password($sid, $currpass, $newpass, $conpass) {
$mysqli = mysqli_connect('localhost','root','','test')
or die('Error ' . mysqli_error($link));

$stmt = $mysqli->prepare('select id, password from users where id = ?');
$stmt->bind_param("s", $sid);
$stmt->execute();
$stmt->bind_result($userid, $userpass);

$message = '';

if ($stmt->fetch()) {
$stmt->close();

if (strlen($newpass) < 8) {
$message = 'Please enter a password with at least 8 characters';
}
elseif (!preg_match('`[A-Z]`', $newpass)) {
$message = 'Please enter at least 1 capital letter';
}
elseif ($newpass !== $conpass) {
$message = 'Your passwords do not match.';
}
else {
if (password_verify($currpass, $userpass)) {
$hashed_new = password_hash($newpass, PASSWORD_BCRYPT);
$query = 'update users set password = ? where id = ?';
$stmt_new = $mysqli->prepare($query);

$stmt_new->bind_param('ss', $hashed_new, $sid);
if ($stmt_new->execute()) {
$message = 'Password Changed';
}
else {
$message = $mysqli->error;
}
}
else $message = 'Current Password is not correct';
}
}
else {
$message = 'user not found for id $sid';
}

$mysqli->close();
return $message;
}
?>
0

Другие решения

Ваша проблема здесь:

if($_POST["currentPassword"] == $row["password"]) {

Вы сравниваете фактическую текстовую версию хэша (например, «пароль») с хешированной версией этого пароля (например, «213y789hwuhui1dh»). Это оценивает:

if("password" == "213y789hwuhui1dh") {

Что, очевидно, никогда не бывает точным. Все, что вам нужно сделать, чтобы решить эту проблему — это хэшировать пароль так же, как вы это делали при его создании. Если я правильно понимаю ваш код, это должно быть:

if(md5(md5($_POST["currentPassword"]))==$row["password"]) {

ПОБОЧНОЕ ЗАМЕЧАНИЕ ПО ВПРЫСКУ SQL

Обратите внимание, что этот код будет очень легко ввести. Все, что нужно сделать пользователю, это завершить значение POST «currentPassword» '; SHOW DATABASE; и они будут иметь неограниченный доступ к базе данных MySQL вашего сервера. Подумайте, как научиться использовать подготовленные операторы MySQLi. Их легко понять и легко реализовать.

1

По вопросам рекламы [email protected]