У меня проблема с функцией PHP password_verify
. Я написал простую функцию PHP, которая использует _GET
, принимает 3 параметра: $user_unique_id
, old_password
и new_password
. Он проверяет, являются ли old password
и password stored in database
одинаковыми. Я использую hash
из моей базы данных и сравниваю его с old password
с помощью password_verify()
fucntion, но он возвращает false
даже whem. Я на 100% уверен, что пароли одинаковы. Может ли кто-нибудь помочь мне с этой проблемой? Я проверил MySQL queries
и все работает очень хорошо. Я возвращаю updated_at
время, которое позже кодирую до JSON
.PHP password_verify возвращает NULL, когда параметры одинаковы
Это моя функция в основном скрипте changeuserpassword.php
я вызываю из ссылки:
<?php
require_once 'include/DB_Functions.php';
$db = new DB_Functions();
// JSON Response Array
$response = array();
// Receiving The Post Params
$old_password = $_GET['old_password'];
$new_password = $_GET['new_password'];
$user_unique_id = $_GET['user_unique_id'];
// Change User Password
$user = $db->changeUserPassword($user_unique_id, $old_password, $new_password);
if ($user != false) {
$response["error"] = false;
$response["user"]["updated_at"] = $user["updated_at"];
echo json_encode($response);
} else {
$response["error"] = true;
$response["error_msg"] = "Podano nieprawidłowe stare hasło";
echo json_encode($response);
}
?>
Это функция я использую в changeuserpassword.php
основного сценария. Это называется changeUserPassword
:
/**
* Change User Account Password
*/
public function changeUserPassword($user_unique_id, $old_password, $new_password) {
$stmt = $this->conn->prepare("SELECT user.`encrypted_password`
FROM `user`
WHERE user.`unique_id` = ?"); // Preparing SELECT Query To The `user` Table
$stmt->bind_param("s", $user_unique_id); // Binding With Params
if ($stmt->execute()) {
$user = $stmt->get_result()->fetch_assoc(); // Fetching Rows From Query
$stmt->close();
$password_hash = $user["encrypted_password"]; // Decrypting Hashed Password
// Checking Currrent Password Identity With Decrypted Password
if (password_verify($old_password, $password_hash)) { // Old Password And Current One Are The Same
$encrypted_password = password_hash($new_password, PASSWORD_DEFAULT); // Hashing New Password
$stmt = $this->conn->prepare("UPDATE user
SET user.`encrypted_password` = ?, user.`updated_at` = NOW()
WHERE user.`unique_id` = ?");
$stmt->bind_param("ss", $encrypted_password, $user_unique_id);
$result = $stmt->execute();
$stmt-close();
// Checking For Succesfull UPDATE
if ($result) {
$stmt = $this->conn->prepare("SELECT user.`updated_at`
FROM `user`
WHERE user.`unique_id` = ?");
$stmt->bind_param("s", $user_unique_id);
$stmt->execute();
$user = $stmt->get_result()->fetch_assoc(); // Fetching Rows From Query
$stmt->close();
return $user;
}
} else { // Old Password And Current One Are Different
return false;
}
}
}
Редактировать
Вот мой скриншот базы данных: Мои работает скрипт, но он всегда возвращает ложь, которая означает, что password_verify()
возвращает ложь.
решаемые
Проблема была $stmt->close()
заявление. Я использовал их слишком часто, и поэтому сценарий не работал.
sidenote: почему вы используете '$ _GET ['new_password']', а не POST? что не так безопасно. –
Я использую его с Google Volley? Я просто начинающий. Любые idae, как это сделать «безопасно» с помощью Java? – anton86993
Извините, я не знаю никаких java. –