Похожая тема имеется, но ответов там нет. Проблема такова: Есть флэшка-форма, в которой клиент должен ввести логин и пароль что бы начать игру. Скрипт выполняющий сравнение ниже: Код (PHP): <?php include ("codec.php"); $name = $_POST['name']; $password = $_POST['password']; $i = 0; $db = mysql_connect("localhost","myname","mypassword"); mysql_select_db("mydb",$db); $fesult = mysql_query("SELECT username,password FROM jos_users",$db); $salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword($password, $salt); $current = $crypt.':'.$salt; while($myarrey = mysql_fetch_array($fesult,MYSQL_ASSOC)){ $salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword($myarrey['password'], $salt); $db_passw = $crypt.':'.$salt; echo "<br>"; echo 'Введенный пароль: '.$password ; echo "<br>"; echo 'Введенный пароль в хэше: '.$current ; echo "<br>"; echo 'Пароль из базы: '.$db_passw; echo "<br>"; if($current == $db_passw){ echo "<br>"; echo "Попал!"; echo "<br>"; } else{ echo "<br>"; echo "Cтратил!"; echo "<br>"; } } mysql_close($db); ?> Хеши никогда не совпадают! Вопрос к знатокам: Что я делаю неправильно? Как их правильно сравнить? Какой скрипт в Joomla производит сравнение,когда логинится клиент? Очень надеюсь на помощь.
наверное потому, что Вы используете JUserHelper::genRandomPassword .... для каких целей ? Если не ошибаюсь, в джумле пароли захешированы с помощью md5? таким образом получим: Код (PHP): $name = $_POST['name']; $password = $_POST['password']; $db = mysql_connect("localhost","myname","mypassword"); mysql_select_db("mydb",$db); $fesult = mysql_query("SELECT password FROM jos_users WHERE name={$name}",$db); в результате выборки, вы получитье одну запись с одним полем - "password". Получим хэш введенного паролья: Код (PHP): $cryptPass = md5($password); Ну а затем просто сравним наш пароль с паролем полученным в результате запроса )
Спасибо что отозвались. Правильно построеный sql-запрос мне очень поможет. Но основная проблемма не решена. Не хешируют сейчас просто md5. Код (CODE): Введенный пароль в хэше: e4be3b8ae2fa6c99f30d0cb44d179afd:rf5ueZVxFhsfmJahgi62vtQj2vDmUFPS Введенный пароль в хэше,но md5: 768a7954d1af355088fba2b0c0e5ab51 Пароль из базы: d629416c794bd8839f1ec90a909ac1d6:D6qUyDh6IuwO1ShI2QsvHTkMMpK28A7r Вот так это выглядит сейчас.Поэтому я и воспользовался тем же скриптом что и сама Joomla! Код (PHP): $salt = JUserHelper::genRandomPassword(32); $crypt = JUserHelper::getCryptedPassword($password, $salt); $current = $crypt.':'.$salt; Класс взял из \libraries\joomla\user\helper.php Проблема. Одинаковый пароль 123456,к примеру, каждый раз в хеше разный.Как же его сравнить с базовым?
Действительно мд5 не канает... немного поковырялся в схеме аутентификации в джумле и получил следующее: Код (PHP): //Делаем запрос в БД по введеному имени пользователя $db =& JFactory::getDBO(); $username = JRequest::getVar('username'); $password = JRequest::getVar('password'); $query = 'SELECT `id`, `password`, `gid`' . ' FROM `#__users`' . ' WHERE username=' . $db->Quote( $username ) ; $db->setQuery( $query ); $result = $db->loadObject(); //если такой пользователь найден if($result) { $parts = explode( ':', $result->password ); // получаем хэш-пароля из БД // пароль состоит из двух частей значение:ключ $crypt = $parts[0]; $salt = @$parts[1]; //с помощью полученного ключа кодируем введенный, пользователем, пароль $testcrypt = JUserHelper::getCryptedPassword($password, $salt); //если пароли совпали, то делаем то что нужно if ($crypt == $testcrypt) { } //если пароль не совпал else { } }//если ввели не правильное имя пользователя else { } Надеюсь ответил на Ваш вопрос.
Великолепно! Гениально! ) salt - это ключ к первой части. Вот где собака и порылась. Теперь работает. Огромное спасибо!