Ru-MaNGOS

Ru-MaNGOS (http://mangos.ytdb.ru/index.php)
-   Языки программирования (http://mangos.ytdb.ru/forumdisplay.php?f=34)
-   -   авторизация (http://mangos.ytdb.ru/showthread.php?t=7941)

Visible 08.04.2014 19:17

авторизация
 
Подскажите пожалуйста, как правильно расшифровать пароль и сделать авторизацию/регистрацию php по табличке account колонки username/sha_pass_hash. никак не выходит что только не перепробывал.

Код:

sha1($_POST['login'] ."',':','". $_POST['password'])
перепробывал различные варианты, но итог один

SeT 08.04.2014 19:47

SELECT SHA1(CONCAT(UPPER(`username`), ':', UPPER(pass)));
Вы наверное забыли перевести логин и пароль в верхний регистр.

Visible 09.04.2014 09:13

Перепробывал многие варианты, но в чем то ошибся..
Код:

if (!empty($_POST))
{
                $login = $db->quote($_POST['login']);
                $query = $db->prepare("SELECT `id` FROM `account` WHERE `username`=".$login." LIMIT 1");
                $query->execute();
                $rows = $query->fetchAll();

                if (count($rows) == 1)
                {
                        $query = $db->prepare("SELECT `id` FROM `account` WHERE `username`=".$login." AND `sha_pass_hash`= SHA1(CONCAT(UPPER($_POST['login']), ':', UPPER($_POST['password']))) LIMIT 1");

                        $query->execute();
                        $row = $query->fetch(PDO::FETCH_ASSOC);
                        $_SESSION['user_id'] = $row['id'];
                       
                        $time = 86400;
                       
                        if (isset($_POST['remember']))
                        {
                                setcookie('login', $login, time()+$time, "/");
                                setcookie('password', $password, time()+$time, "/");
                        }
                        header('Location: index.php');
                        exit;
                }
                else
                {
                        echo "<meta http-equiv='refresh' content='0; url=/index.php'>";
                }
}


Кот ДаWINчи 09.04.2014 15:08

ужасный код, хоть и через ПДО...
Опустим то, что твой код - это только кусок кода а не весь алгоритм. Надеюсь что $db где-то выше в начале файла объявляется.
далее ты просто выбираешь "SELECT `id` FROM `account` WHERE `username`=".$login." LIMIT 1"

и если такая запись существует снова сделать запрос уже с хешем пароля, и без проверки выполнения запроса тупо присваиваешь ИД-шник в сессию.

Такое конечно работать не будет.

RomanRom2 09.04.2014 23:22

работать то будет, только зачем делать два запроса то? делайте один запрос сразу со всеми критериями.
и зачем же так изголяться с апперами :) сделайте просто один SHA1(UPPER( от строки
$_POST['login']) . ':' . $_POST['password']
смысл какой по отдельным кускам регистр переводить?

лично я люблю железобетонный код. совершенно тупой и без использования рюшек, не вызывающий никакого двоякого чувства. в частности SHA1(UPPER( я бы сделал на стороне пхп. это во первых проще и понятнее для будущей отладки, проще sql серверу и избавляет от передачи по сети собсно логина и пароля - это для фанатов ПДО, хотя тут на локалхосте это ПДО как пятое колесо.

Кот ДаWINчи 10.04.2014 09:57

как говориться, "вынести за скобки" upper сам бог велел. И это даже не из-за железобетонности, а просто из соображений логики и оптимизации кода.

А вот на счет ПДО не согласен. в данный момент, когда неумолимо приближается пхп 6, писать проекты на библиотеке mysql просто убийственно. так как в 6-ке обещают что эта библиотека будет иметь статус "Deprecated", а преемница mysqli до сих пор очень сыра и нестабильна, то волей неволей приходится обращать свой взор на монструозный ПДО.

Надо будет в выходной выделить пару часиков и накидать примерный код движка с авторизацией. (да бы новички смогли понять всю логику взаимодействия пхп и базы)

Как сделаю - опубликую здесь.

Visible 11.04.2014 18:12

да я не претендую на оригинальность кода. К сожалению мои знания в php не столь велики чтобы сразу делать лучше. Буду ждать примерчика авторизации. Большое спасибо

Visible 13.04.2014 15:32

вроде разобрался. сделал это так:
Код:

if (!empty($_POST))
{
                $login = $db->quote($_POST['login']);
                $pass = $db->quote(sha1(strtoupper($_POST['login'].":".$_POST['password'])));
                $query = $db->prepare("SELECT `id` FROM `account` WHERE `username`={$login} AND `sha_pass_hash`={$pass} LIMIT 1");
                $query->execute();
                $rows = $query->fetchAll();

                // если такой пользователь нашелся
                if (count($rows) == 1)
                {
                        $query = $db->prepare("SELECT `id` FROM `account` WHERE `username`={$login} AND `sha_pass_hash`={$pass} LIMIT 1");
                        $query->execute();
                        $row = $query->fetch(PDO::FETCH_ASSOC);
                        $_SESSION['user_id'] = $row['id'];
                       
                        $time = 86400;
                       
                        if (isset($_POST['remember']))
                        {
                                setcookie('login', $login, time()+$time, "/");
                                setcookie('password', $password, time()+$time, "/");
                        }
                       
                        header('Location: index.php');
                        exit;

                }
                else
                {
                        echo "<script>alert(\"Не правильно ввели логин/пароль.\");</script>";
                        echo "<meta http-equiv='refresh' content='0; url=/index.php'>";
                }
}

Но есть вещичка, которую не пойму. почему теле условия недоступен результат запроса, приходится этот запрос дублировать. как будет правильно?
нашел выход через
Код:

$_SESSION['user_id'] = $rows['0']['id'];

Кот ДаWINчи 14.04.2014 21:44

Вложений: 1
Вот накидал пример авторизации через сессии (без регистрации). Всё работает.

Сразу предупреждаю, что это пример, а не рабочий движок.


Текущее время: 19:58. Часовой пояс GMT +3.

ru-mangos.ru - Русское сообщество MaNGOS