Добрый вечер, столкнулся с такой проблемой, что при вводе на сайте правильного пароля, он пишет, что пароль неверный. К примеру, логин такой то, пароль 123456, нажимаю Войти и пишет, что пароль неверный, хотя даже расшифровка мд5 показывает, что это пароль 123456 и что хэш верный. Началось это после переезда на новую базу данных с другими названиями столбцов, но они все подправлены, а пароль всё равно неверный. Имя столбца пароля в базе - pPassword. Раньше было Key. Сервера два, базы разные, второй не волнует, там всё в порядке. Хэш пароля: e10adc3949ba59abbe56e057f20f883e Что может работать не так? Почему он не распознает пароль? Часть кода: PHP: <?php class Accounts { private $db; private $db2; public $error; public $getData; public function __construct() { try { $this->db = Database::loadserver1(); $this->db->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $this->db->exec("set names utf8"); } catch(PDOException $e) { $today = getdate(); $today = '\n'.$today["hours"].':'.$today["minutes"].':'.$today["seconds"].' - '.$today["mday"].'-'.$today["mon"].'-'.$today["year"]; file_put_contents('PDOErrors.txt', $today , FILE_APPEND); file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); die(); } try { $this->db2 = Database::loadserver2(); $this->db2->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $this->db2->exec("set names utf8"); } catch(PDOException $e) { $today = getdate(); $today = '\n'.$today["hours"].':'.$today["minutes"].':'.$today["seconds"].' - '.$today["mday"].'-'.$today["mon"].'-'.$today["year"]; file_put_contents('PDOErrors.txt', $today , FILE_APPEND); file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND); die(); } } public function login(){ if (isset($_SESSION['statusLogin'])) {if ($_SESSION['statusLogin'] == 'true') { header("Location: /profile/");die;} else {$_SESSION['statusLogin'] = 'false';}} else { $_SESSION['statusLogin'] = 'false'; } if (isset($_POST['auth_login'])) { $server = $_POST['auth_server']; $login = $_POST['auth_login']; $pass = $_POST['auth_pass']; $check = md5($pass); $password = mb_strtoupper($check); // Сервер 1 if($server == 1) { $dbz = $this->db->prepare("SELECT * FROM `Accounts` WHERE `Name` = :login"); $dbz->bindParam(':login', $login, PDO::PARAM_STR); $dbz->execute(); $this->getData = $dbz->fetch(PDO::FETCH_ASSOC); if (!$this->getData) { $this->error = "Аккаунт не найден на сервере №1"; } else { if ($this->getData['pPassword'] == $password) { $_SESSION['authLogin'] = $login; $_SESSION['statusLogin'] = 'true'; $_SESSION['statusServer'] = 1; header("Location: /profile/"); die; } else { $this->error = "Неверный пароль. "; } } } if($server == 2) { $dbz = $this->db2->prepare("SELECT * FROM `accounts` WHERE `NickName` = :login"); $dbz->bindParam(':login', $login, PDO::PARAM_STR); $dbz->execute(); $this->getData = $dbz->fetch(PDO::FETCH_ASSOC); if (!$this->getData) { $this->error = "Аккаунт не найден на сервере №2"; } else { if ($this->getData['Key'] == $password) { $_SESSION['authLogin'] = $login; $_SESSION['statusLogin'] = 'true'; $_SESSION['statusServer'] = 2; header("Location: /profile/"); die; } else { $this->error = "Неверный пароль."; } } } } View::render('login', array ( 'pageTitle' => 'Авторизация', 'authStatus' => $_SESSION['statusLogin'], 'error' => $this->error )); } public function profile(){ if (isset($_SESSION['statusLogin'])) { if ($_SESSION['statusLogin'] == 'false') { header("Location: /login/"); die; } } else { header("Location: /login/"); die; } $login = $_SESSION['authLogin']; $server = $_SESSION['statusServer']; $usluga = $_POST['usluga'];
Заметил такой нюанс, что раньше пароли были написаны капсом, к примеру, 632F3E0A10E3A46839E2FBC1D41BF91B, а сейчас в таком виде - d8578edf8458ce06fbc5bb76a58c5ca4. Может ли это как то влиять?
debug http://phpfaq.ru/debug https://netbeans.org/kb/docs/php/debugging_ru.html https://php.ru/forum/threads/howto-...i-po-shagam-i-s-kartinkami.58974/#post-474550
А может быть так, что не код виноват? Почему тогда, когда было написано поле `Key` вместо `pPassword` все работало, а после смены перестало работать?
Кто тогда? Проверка же в коде происходит, можешь и запросы отлаживать в базе. У тебя задача, которую ты можешь решить отладкой, за тебя мало кто это сделает, у них нет твоего окружения.
Решение было зарыто в регистре символов, когда решил закомментировать данную команду mb_strtoupper. В базе пароли записаны маленькими буквами, а эта команда делает их большими и после уже сравнивает с базой, поэтому и писало, что пароль неверный.
Чувак, если ты осилил пдо и плейсхолдеры, то осиль плс нормальный способ хеширования паролей. https://php.ru/manual/function.password-hash.html читай и делай. Рекомендую использовать только PASSWORD_DEFAULT