PDA

Просмотр полной версии : авторизация


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
Вот накидал пример авторизации через сессии (без регистрации). Всё работает.

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