Ru-MaNGOS

Вернуться   Ru-MaNGOS > Документация > Языки программирования

Важная информация

Языки программирования Изучаем С++, Sql, php, Lua, Python

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
Старый 08.04.2014, 19:17   #1
Visible
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 56
Сказал(а) спасибо: 16
Поблагодарили 0 раз(а) в 0 сообщениях
Visible На верном пути
Печаль авторизация

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

Код:
sha1($_POST['login'] ."',':','". $_POST['password'])
перепробывал различные варианты, но итог один
Visible вне форума   Ответить с цитированием
Старый 08.04.2014, 19:47   #2
SeT
Ученый
 
Аватар для SeT
 
Регистрация: 13.03.2010
Сообщений: 110
Сказал(а) спасибо: 55
Поблагодарили 23 раз(а) в 14 сообщениях
SeT На верном пути
По умолчанию

SELECT SHA1(CONCAT(UPPER(`username`), ':', UPPER(pass)));
Вы наверное забыли перевести логин и пароль в верхний регистр.
SeT вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Visible (09.04.2014)
Старый 09.04.2014, 09:13   #3
Visible
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 56
Сказал(а) спасибо: 16
Поблагодарили 0 раз(а) в 0 сообщениях
Visible На верном пути
По умолчанию

Перепробывал многие варианты, но в чем то ошибся..
Код:
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'>";
		}
}
Visible вне форума   Ответить с цитированием
Старый 09.04.2014, 15:08   #4
Кот ДаWINчи
Умный
 
Аватар для Кот ДаWINчи
 
Регистрация: 07.03.2010
Адрес: Северный Урал (60°сш, 60°вд)
Сообщений: 330
Сказал(а) спасибо: 82
Поблагодарили 399 раз(а) в 120 сообщениях
Записей в дневнике: 30
Кот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человек
Отправить сообщение для Кот ДаWINчи с помощью ICQ Отправить сообщение для Кот ДаWINчи с помощью Skype™
По умолчанию

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

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

Такое конечно работать не будет.
Кот ДаWINчи вне форума   Ответить с цитированием
Старый 09.04.2014, 23:22   #5
RomanRom2
WowCore Dev
 
Аватар для RomanRom2
 
Регистрация: 31.03.2010
Сообщений: 468
Сказал(а) спасибо: 73
Поблагодарили 106 раз(а) в 70 сообщениях
RomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всемRomanRom2 Это имя известно всем
По умолчанию

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

лично я люблю железобетонный код. совершенно тупой и без использования рюшек, не вызывающий никакого двоякого чувства. в частности SHA1(UPPER( я бы сделал на стороне пхп. это во первых проще и понятнее для будущей отладки, проще sql серверу и избавляет от передачи по сети собсно логина и пароля - это для фанатов ПДО, хотя тут на локалхосте это ПДО как пятое колесо.
RomanRom2 вне форума   Ответить с цитированием
Пользователь сказал cпасибо:
Visible (11.04.2014)
Старый 10.04.2014, 09:57   #6
Кот ДаWINчи
Умный
 
Аватар для Кот ДаWINчи
 
Регистрация: 07.03.2010
Адрес: Северный Урал (60°сш, 60°вд)
Сообщений: 330
Сказал(а) спасибо: 82
Поблагодарили 399 раз(а) в 120 сообщениях
Записей в дневнике: 30
Кот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человек
Отправить сообщение для Кот ДаWINчи с помощью ICQ Отправить сообщение для Кот ДаWINчи с помощью Skype™
По умолчанию

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

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

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

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

Последний раз редактировалось NeatElves; 10.04.2014 в 21:39.
Кот ДаWINчи вне форума   Ответить с цитированием
2 пользователя(ей) сказали cпасибо:
RomanRom2 (11.04.2014), Visible (11.04.2014)
Старый 11.04.2014, 18:12   #7
Visible
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 56
Сказал(а) спасибо: 16
Поблагодарили 0 раз(а) в 0 сообщениях
Visible На верном пути
По умолчанию

да я не претендую на оригинальность кода. К сожалению мои знания в php не столь велики чтобы сразу делать лучше. Буду ждать примерчика авторизации. Большое спасибо
Visible вне форума   Ответить с цитированием
Старый 13.04.2014, 15:32   #8
Visible
Пользователь
 
Регистрация: 11.07.2010
Сообщений: 56
Сказал(а) спасибо: 16
Поблагодарили 0 раз(а) в 0 сообщениях
Visible На верном пути
По умолчанию

вроде разобрался. сделал это так:
Код:
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.
Visible вне форума   Ответить с цитированием
Старый 14.04.2014, 21:44   #9
Кот ДаWINчи
Умный
 
Аватар для Кот ДаWINчи
 
Регистрация: 07.03.2010
Адрес: Северный Урал (60°сш, 60°вд)
Сообщений: 330
Сказал(а) спасибо: 82
Поблагодарили 399 раз(а) в 120 сообщениях
Записей в дневнике: 30
Кот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человекКот ДаWINчи Реально хороший человек
Отправить сообщение для Кот ДаWINчи с помощью ICQ Отправить сообщение для Кот ДаWINчи с помощью Skype™
Лампочка

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

Сразу предупреждаю, что это пример, а не рабочий движок.
Вложения
Тип файла: zip primer1.zip (2.4 Кб, 366 просмотров)
Кот ДаWINчи вне форума   Ответить с цитированием
Ответ


Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Авторизация Archon64 MaNGOSZero (1.12.X) 1 02.11.2012 08:58
BattleNet авторизация Konctantin Копаем клиент 71 25.04.2011 07:51


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


ru-mangos.ru - Русское сообщество MaNGOS
Главная цель проекта MaNGOS - обучающая, поэтому разрешается использовать исходный код и собранную программу только для образовательных целей.
Вы не можете использовать MaNGOS в коммерческих целях, а также не разрешается устанавливать публичные серверы на базе MaNGOS.
Любое копирование материалов, информации в любом виде без указания источника - форума Ru-MaNGOS будет считаться нарушением авторских прав и нарушением Уголовного Кодекса РФ, ст. 146 ст. 147.
Перевод vBulletin: zCarot