|
Языки программирования Изучаем С++, Sql, php, Lua, Python |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
08.04.2014, 19:17 | #1 |
Пользователь
Регистрация: 11.07.2010
Сообщений: 56
Сказал(а) спасибо: 16
Поблагодарили 0 раз(а) в 0 сообщениях
|
авторизация
Подскажите пожалуйста, как правильно расшифровать пароль и сделать авторизацию/регистрацию php по табличке account колонки username/sha_pass_hash. никак не выходит что только не перепробывал.
Код:
sha1($_POST['login'] ."',':','". $_POST['password']) |
09.04.2014, 09:13 | #3 |
Пользователь
Регистрация: 11.07.2010
Сообщений: 56
Сказал(а) спасибо: 16
Поблагодарили 0 раз(а) в 0 сообщениях
|
Перепробывал многие варианты, но в чем то ошибся..
Код:
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'>"; } } |
09.04.2014, 15:08 | #4 |
Умный
Регистрация: 07.03.2010
Адрес: Северный Урал (60°сш, 60°вд)
Сообщений: 330
Сказал(а) спасибо: 82
Поблагодарили 399 раз(а) в 120 сообщениях
Записей в дневнике: 30
|
ужасный код, хоть и через ПДО...
Опустим то, что твой код - это только кусок кода а не весь алгоритм. Надеюсь что $db где-то выше в начале файла объявляется. далее ты просто выбираешь "SELECT `id` FROM `account` WHERE `username`=".$login." LIMIT 1" и если такая запись существует снова сделать запрос уже с хешем пароля, и без проверки выполнения запроса тупо присваиваешь ИД-шник в сессию. Такое конечно работать не будет. |
09.04.2014, 23:22 | #5 |
WowCore Dev
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
|
работать то будет, только зачем делать два запроса то? делайте один запрос сразу со всеми критериями.
и зачем же так изголяться с апперами сделайте просто один SHA1(UPPER( от строки $_POST['login']) . ':' . $_POST['password'] смысл какой по отдельным кускам регистр переводить? лично я люблю железобетонный код. совершенно тупой и без использования рюшек, не вызывающий никакого двоякого чувства. в частности SHA1(UPPER( я бы сделал на стороне пхп. это во первых проще и понятнее для будущей отладки, проще sql серверу и избавляет от передачи по сети собсно логина и пароля - это для фанатов ПДО, хотя тут на локалхосте это ПДО как пятое колесо. |
Пользователь сказал cпасибо: | Visible (11.04.2014) |
10.04.2014, 09:57 | #6 |
Умный
Регистрация: 07.03.2010
Адрес: Северный Урал (60°сш, 60°вд)
Сообщений: 330
Сказал(а) спасибо: 82
Поблагодарили 399 раз(а) в 120 сообщениях
Записей в дневнике: 30
|
как говориться, "вынести за скобки" upper сам бог велел. И это даже не из-за железобетонности, а просто из соображений логики и оптимизации кода.
А вот на счет ПДО не согласен. в данный момент, когда неумолимо приближается пхп 6, писать проекты на библиотеке mysql просто убийственно. так как в 6-ке обещают что эта библиотека будет иметь статус "Deprecated", а преемница mysqli до сих пор очень сыра и нестабильна, то волей неволей приходится обращать свой взор на монструозный ПДО. Надо будет в выходной выделить пару часиков и накидать примерный код движка с авторизацией. (да бы новички смогли понять всю логику взаимодействия пхп и базы) Как сделаю - опубликую здесь. Последний раз редактировалось NeatElves; 10.04.2014 в 21:39. |
11.04.2014, 18:12 | #7 |
Пользователь
Регистрация: 11.07.2010
Сообщений: 56
Сказал(а) спасибо: 16
Поблагодарили 0 раз(а) в 0 сообщениях
|
да я не претендую на оригинальность кода. К сожалению мои знания в php не столь велики чтобы сразу делать лучше. Буду ждать примерчика авторизации. Большое спасибо
|
13.04.2014, 15:32 | #8 |
Пользователь
Регистрация: 11.07.2010
Сообщений: 56
Сказал(а) спасибо: 16
Поблагодарили 0 раз(а) в 0 сообщениях
|
вроде разобрался. сделал это так:
Код:
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']; Последний раз редактировалось Visible; 13.04.2014 в 18:09. |
14.04.2014, 21:44 | #9 |
Умный
Регистрация: 07.03.2010
Адрес: Северный Урал (60°сш, 60°вд)
Сообщений: 330
Сказал(а) спасибо: 82
Поблагодарили 399 раз(а) в 120 сообщениях
Записей в дневнике: 30
|
Вот накидал пример авторизации через сессии (без регистрации). Всё работает.
Сразу предупреждаю, что это пример, а не рабочий движок. |
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Авторизация | Archon64 | MaNGOSZero (1.12.X) | 1 | 02.11.2012 08:58 |
BattleNet авторизация | Konctantin | Копаем клиент | 71 | 25.04.2011 07:51 |