Как можно войти в аккаунт, если регистрируюсь такой функцией Код (Text): private function encryptPassword($password, $md5 = true) { if($md5 !== false) { $password = md5($password); } $hash = substr($password, 16, 16) . substr($password, 0, 16); return $hash; } private function getLoginHash($password, $staticKey, $username) { $hash = $this->encryptPassword($password, false); $hash .= $staticKey; $hash .= "a1ebe00441f5aecb185d0ec178ca2305Y(02.>'H}t\":E1_root"; $hash = $this->encryptPassword($hash); $hash = password_hash($hash, PASSWORD_DEFAULT, [ 'cost' => 12 ]); return $hash; } $hashedPassword = strtoupper(md5($password)); $staticKey = 'e4a2dbcca10a7246817a83cd'; $fancyPassword = $this->getLoginHash($hashedPassword, $staticKey, $username); Вот страница входа: Код (Text): <?php class login { public $username; public $password; public function __construct($u, $p) { $this->username = $u; $this->password = $p; } //Information: 2 means error. true means logging in... function isUserValid() { $con = mysqli_connect('localhost', 'root', '', 'test'); $username = mysqli_real_escape_string($con, $this->username); $password = mysqli_real_escape_string($con, $this->password); $query = mysqli_query($con, "SELECT * FROM `penguins` WHERE `username` = '".$username."' AND `password` = '".md5($password)."'"); if($query) { while($row = mysqli_fetch_assoc($query)) { return true; die(); } } else { return 2; die(); } } } ?>
Это какой то ужас. Бедные пингвины. --- Добавлено --- Ну если ты это ложишь в бд то с этим и сверяй а не с md5($password)
@Sasha55555 во первых md5 устарел, умные люди используют давно уже password_hash --- Добавлено --- Во вторых - так проверять пароль какое - то прямо удаление зуба через задницу. В третьих. Это конечно классно что ты сделал экранирование данных. Но обычно это делают уже с тем значением которую ты не посредственно вставляешь в строку запроса, а у тебя тут тоже как то через опу сначала экранирование и после этого md5 сверху и потом уже в запрос... Рекомендации: перейти на функцию pasword_hash, далее при сверки пароля сначала выбрать по username строку в таблице, получить от туда данные о password для данного user и после уже в php сравнить поступающий пароль с текущим значением пароля в таблице функцией password verify .
А первый кусок кода я даже комментировать и разбирать не хочу.... Хеш сделал в password_hash, а пароль запихал в md5... Перепиши сеё безобразие на password_hash
Сделай копию сохрани на компе через полгода загляни посмотри... И наименование wtf поставь --- Добавлено --- А сейчас сотри всё что написал и сделай подобную (пример ниже) функцию PHP: static public function addUser($email, $password, $name, $phone = '') { if (empty($email) or empty($password) or empty($name)) { return false; } $password = password_hash($password, PASSWORD_DEFAULT); $sql = 'INSERT INTO users (name, email, phone, password)' . ' VALUES (:name, :email, :phone, :password)'; $sth = DB::connect()->prepare($sql); // Этой моё подключение к бд. Тебе необходимо поставить своё. $arrayParam = [ ':name' => $name, ':phone' => $phone, ':email' => $email, ':password' => $password ]; $sth->execute($arrayParam); return DB::connect()->lastInsertId(); } P.S Параметры столбцов и передаваемых аргументов подкорректируй под свою таблицу.
Это регистрация, а авторизация? Код (Text): if($penguin->database->usernameExists($username) === false) { password_verify('KitsuneTimingAttack', '$2y$12$5hf7vOtBjsNJf6oZSsnyXOlcLTRblTwSg550SR0ohxVUkItmXhMM6'); //Mitigate timing attacks $penguin->send("%xt%e%-1%101%"); return $this->removePenguin($penguin); }
У меня зарегистрировано уже 100 человек, как можно перейти на password_hash? И сейчас каким образом хешируется пароль? $2y$12$.3TjTwffHoY76X/UCu358.WiHPqx1X7iwK0k3s7GKFgNXXB4WhUji Вот функция авторизации которая работает с этим паролем, как перенести ее ко мне? Код (Text): final class Login extends ClubPenguin { public function __construct() { parent::__construct(); Logger::Fine("Login server is online"); } protected function handleLogin($socket) { $penguin = $this->penguins[$socket]; if($penguin->handshakeStep !== "randomKey") { return $this->removePenguin($penguin); } $this->databaseManager->add($penguin); $username = Packet::$Data['body']['login']['nick']; $password = Packet::$Data['body']['login']['pword']; if($penguin->database->usernameExists($username) === false) { password_verify('KitsuneTimingAttack', '$2y$12$5hf7vOtBjsNJf6oZSsnyXOlcLTRblTwSg550SR0ohxVUkItmXhMM6'); //Mitigate timing attacks $penguin->send("%xt%e%-1%101%"); return $this->removePenguin($penguin); } $penguinData = $penguin->database->getColumnsByName($username, array("ID", "Username", "Password", "SWID", "Email", "Banned")); $encryptedPassword = $penguinData["Password"]; if(password_verify($password, $encryptedPassword) !== true) { $penguin->send("%xt%e%-1%101%"); return $this->removePenguin($penguin); } elseif($penguinData["Banned"] > strtotime("now") || $penguinData["Banned"] == "perm") { if(is_numeric($penguinData["Banned"])) { $hours = round(($penguinData["Banned"] - strtotime("now")) / ( 60 * 60 )); $penguin->send("%xt%e%-1%601%$hours%"); $this->removePenguin($penguin); } else { $penguin->send("%xt%e%-1%603%"); $this->removePenguin($penguin); } } else { $confirmationHash = md5($penguin->randomKey); $friendsKey = md5($penguinData["ID"]); // May need to change this later! $loginTime = time(); $penguin->database->updateColumnById($penguinData["ID"], "ConfirmationHash", $confirmationHash); $penguin->database->updateColumnById($penguinData["ID"], "LoginKey", $encryptedPassword); $penguin->handshakeStep = "login"; $penguin->send("%xt%l%-1%{$penguinData["ID"]}|{$penguinData["SWID"]}|{$penguinData["Username"]}|$encryptedPassword|1|45|2|false|true|$loginTime%$confirmationHash%$friendsKey%101,1%{$penguinData["Email"]}%"); } } protected function handleDisconnect($socket) { $penguin = $this->penguins[$socket]; $this->removePenguin($penguin); } public function removePenguin($penguin) { $this->removeClient($penguin->socket); $this->databaseManager->remove($penguin); unset($this->penguins[$penguin->socket]); Logger::Notice("Player disconnected"); } }
@Sasha55555 нанять программиста за деньги. Ибо сами вы учиться не хотите. Есть такой раздел тут фриланс - обратитесь туда. Не надо ставить опыты на живых людях наймите специалиста пусть сделает. Нельзя на продакшене разрабатывать такие вещи!
@MouseZver не обязательно Можно сделать кастыль временный. Нормально я ответил выше. Вы не понимаете. Что я могу сделать? Поэтому и говорю наймите специалиста. Но можно попробовать включить свой мозг (если он есть). И догодаться переделать уже регистрацию на пассворд хеш. А авторизацию сделать пассворд хеш и если не подошло прогнать по мд5 и если так не подошло послать отрицательный овтет.
Это, мне кажется не то. Он регал юзеров используя md5 в качестве хэша пароля. Тут однозначно. просто предложить пользователям зарегаться заново. Одно дело если бы он регал изначально используя password_hash а в последующем сменил просто алгоритм хэширования.
Зачем? Ставишь правило, что если пароль в md5, а это легко проверить по его длине и отсутствию того же знака доллара, то сверяешь его с тем, что в БД по md5, а потом прогоняешь через password_hash() и пишешь в БД новый слепок. Зачем просить кого-то перерегаться, если тебе нужен его ПАРОЛЬ, который он точно так же вводит и передает тебе в чистом виде?
Это костыль. Имхо, не стоит ложить костыль при старте проекта. Проще просто попросить пользователей зарегаться по новой. Из всего 15)
Проще вообще ничего не хешировать, раз на то пошло. Первое и главное правило - клиента не должны касаться ТВОИ проблемы. Он не должен входить в ТВОЕ положение. Не вижу проблему в том, чтобы временно инклудить файлик, реализующий перехеширование пароля. То, что клиентов не много, не значит, что на них надо хер класть и перекладывать на них решение твоих косяков. Ему плевать на твою красоту кода, на твое чувство вины из-за технического долга. Он вообще не в курсе, как работает твой сайт. И если мне завтра какой-то сервис снихрена пришлет мессагу, мол, срочно зарегайся заново, потому что мы подумали подумали, да и дропнули твой аккаунт, потому что нам влом решать задачу рехеширования, сервис будет послан в дальнее пешее.