Добро пожаловать на Pawno-Info.Ru - Портал о программировании v2.0

Присоединяйтесь к нам сейчас, чтобы получить доступ ко всем нашим функциям. После регистрации и входа в систему вы сможете создавать темы, публиковать ответы в существующих темах, давать репутацию своим коллегам, получать собственный личный мессенджер и многое другое. Это также быстро и совершенно бесплатно, так чего же вы ждете?

Реклама

Вы можете заказать рекламу для вашего сообщества, или проекта на нашем портале. Реклама - двигатель торговли.

Что нового?

Хотите в один клик узнать что нового пишут наши пользователи? Тогда Вам сюда.

Связь с Администрацией

Если у Вас есть вопрос по работе портала, который Вы не в силах решить сами? Тогда напишите нам об это тут.

[Мануал] Система регистрации

Jam999

• Зарегистрированный •
Регистрация
16 Янв 2019
Сообщения
4
Реакции
0
Всем привет. Сегодня я хочу провести мануал, как создать систему регистрации
Прошу судить не строго, моя первая статься.
Приступим.

Создаем базу. -

Первое что мы сделаем, так это добавить инклуд <a_mysql>

PHP:
#include <a_samp>
#include <a_mysql>
Второе. Добавляем дефайны для подключения к БД

PHP:
#define MySQL_HOST "localhost" // Хостинг MySQL
#define MySQL_USER "root" // Имя пользователя MySQL
#define MySQL_BASE "base" // База данных MySQL
#define MySQL_PASS "" // Пароль от данных MySQL
Третие что мы сделаем, так это создадим переменную new dbHandle;
Ее можно поменять на любую переменную, пример: connect_mysql

PHP:
new dbHandle;
Четвертое. Идем в паблик OnGameModeInit(), и подключаем к базе данных

PHP:
public OnGameModeInit()
{
	dbHandle = mysql_connect(MySQL_HOST, MySQL_USER, MySQL_BASE , MySQL_PASS);
	return true;
}
Пятое. Добавим текст, смогли MySQL база подключиться к моду

PHP:
public OnGameModeInit()
{
	dbHandle = mysql_connect(MySQL_HOST, MySQL_USER, MySQL_BASE , MySQL_PASS);
	if(mysql_errno()==0)
	{
		printf("[MySQL]: Я смог подключиться к базе данным.");
	}
	else
	{
		return printf("[MySQL]: Я не смог подключиться к базе данным! Код ошибки #%d", mysql_errno());
	}
	return true;
}
Шестое. Добавим в OnGameModeInit() автоустановку кодировку.

PHP:
public OnGameModeInit()
{
	dbHandle = mysql_connect(MySQL_HOST, MySQL_USER, MySQL_BASE , MySQL_PASS);
	if(mysql_errno()==0)
	{
		printf("[MySQL]: Я смог подключиться к базе данным.");
	}
	else
	{
		return printf("[MySQL]: Я не смог подключиться к базе данным! Код ошибки #%d", mysql_errno());
	}
	mysql_set_charset("cp1251");
	return true;
}
Седьмое. Добавим массив хранение данных аккаунтов

PHP:
enum pInfo
{
	pID, // ID игрока
	pName[24+1], // Ник игрока, 24 - макс. длина ника, +1 - нулевая ячейка.
	pPass[32+1] // Пароль игрока, 32 - макс.длина пароля, +1 - нулевая ячейка
}
new PlayerInfo[MAX_PLAYERS][pInfo];
Восьмое. Идем в паблик OnPlayerConnect(playerid), узнаем ник игрока

PHP:
public OnPlayerConnect(playerid)
{
	GetPlayerName(playerid, PlayerInfo[playerid][pName], 24+1); // 24 - Макс.длина ника, +1 - нулевая ячейка.
	return true;
}
Девятое. Идем в паблик OnPlayerConnect(playerid), делаем запрос в MySQL
PHP:
public OnPlayerConnect(playerid)
{
	GetPlayerName(playerid, PlayerInfo[playerid][pName], 24+1); // 24 - Макс.длина ника, +1 - нулевая ячейка.
	format(string, sizeof(string), "SELECT `ID` FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pName]);
	mysql_function_query(dbHandle, string, true, "OnPlayerRegCheck", "d", playerid); // OnPlayerRegCheck - При помощи него, мы узнаем, игрок зарегестрирован, или нет.
	return true;
}
Десятое. Создаем форвард OnPlayerRegCheck(playerid);

PHP:
forward OnPlayerRegCheck(playerid);
public OnPlayerRegCheck(playerid)
{
	new rows, fields;
	cache_get_data(rows, fields)
	if(rows)
	{
		// Игрок зарегестрирован.
	}
	else
	{
		// Игрок не зарегестрирован.
	}
	return true;
}
Вот и подходит конец моего первого урока. Скоро продолжу. Есть вопросы, пишите.
 

Maks5

Мастер
Пользователь
Регистрация
17 Май 2011
Сообщения
3,107
Реакции
977
Версию MySQL хоть укажи...
 

SholohovTM

Заблокирован
Регистрация
20 Фев 2019
Сообщения
2
Реакции
0
Адрес
Беларусь
Дружище, молодец конечно, но если хочешь сделать оригинальнее. Скринов бы больше, как вставляешь, куда, новичкам всегда полезно.
А для себя и в будущем (кто будет брать код из твоего мануала) обнови версию mysql , чтобы не заводить в заблуждение и продвигаться к лучшему.
PHP:
    new rows, fields; 
    cache_get_data(rows, fields)
А это старье как бы....
Да и вовсе, если это мануал и хочешь сделать хоть как-то оригинально. Указал бы ссылку , что, где взять, куда, что вставлять .
Как подключить и прочее, вот чисто для меня. Это не оригинально, очень много уже таких мануалов. А за время моего отсутствия, думаю еще больше стало. Да и мало новых людей которых сейчас вникают вообще в разработку модов, если ты хочешь привлечь новых людей, сделай оригинальнее, чтобы случайный человек, даже если это на старую аудиторию , то зашел, опа. Мануал, вау, как круто, все понял, дай повторю и тд.


Извиняй за критику, ну все по существу:bt:
 

Salery

Специалист
Пользователь
Регистрация
27 Ноя 2016
Сообщения
542
Реакции
240
А где регистрация сама то? Убери 6 пункт, mysql_set_charset("cp1251"); - добавь в пятый, зачем усложнять мануал? Регистрации тут нет, максимум кусок авторизации
 

AndNatt

Участник форума
Пользователь
Регистрация
3 Янв 2012
Сообщения
270
Реакции
27
PHP:
public OnPlayerConnect(playerid) 
{ 
    GetPlayerName(playerid, PlayerInfo[playerid][pName], 24+1); // 24 - Макс.длина ника, +1 - нулевая ячейка. 
    format(string, sizeof(string), "SELECT `ID` FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pName]); 
    mysql_function_query(dbHandle, string, true, "OnPlayerRegCheck", "d", playerid); // OnPlayerRegCheck - При помощи него, мы узнаем, игрок зарегестрирован, или нет. 
    return true; 
}
А где простите new string[...] - ?
 

AndreY.eXe

Специалист
Пользователь
Регистрация
16 Сен 2017
Сообщения
1,332
Реакции
227
Адрес
unknown
1. Более легче будет добавлять SQL-запросы на создание таблиц, нежели скрины. Но это будет полезно для новичков, чтобы они поняли, как вообще создаются таблицы.
2. Если ты в моде устанавливаешь кодировку, то устанавливай её и при создании таблицы/строки ("Сравнение"). Иначе у тебя будут каракули/знаки вопроса.
3. В новых версиях MySQL при создании переменной базы, необходимо указывать тег MySQL: после new: new MySQL: dbhandle.
4. Лучше уж тогда так:
PHP:
public OnGameModeInit()
{ 
    dbHandle = mysql_connect(MySQL_HOST, MySQL_USER, MySQL_BASE , MySQL_PASS);
    if(!mysql_errno())
    {
    	printf("[MySQL]: Я не смог подключиться к базе данным! Код ошибки #%d", mysql_errno());
    	return OnGameModeExit();
    }

    mysql_set_charset("cp1251");
    return printf("[MySQL]: Я смог подключиться к базе данным.");
}
5. В чем прикол писать +1? Или ты не можешь сосчитать 24+1?
6. Как выше сказали, в 9 пункте нет new string.
7. Используй mysql_format, чтобы избежать SQL-инъекций.
8. На замену cache_get_data идет cache_num_rows();
9. Можно не создавать forward и писать сразу продолжение кода:
PHP:
public OnPlayerConnect(playerid) 
{
	new string[48 + 25];
    GetPlayerName(playerid, PlayerInfo[playerid][pName], 25); // 24 - Макс.длина ника, +1 - нулевая ячейка. 

    mysql_format(dbhandle, string, sizeof(string), "SELECT `ID` FROM `accounts` WHERE `Name` = '%s'", PlayerInfo[playerid][pName]); 
    mysql_query(dbhandle, string);

    if(!cache_num_rows())
    {
    	// Аккаунт не зарегистрирован
    }
    else 
    {
    	// Аккаунт зарегистрирован
    }
    return true; 
}
 

iWors

Профессионал
Ветеран - PI
Регистрация
3 Июн 2015
Сообщения
5,617
Реакции
738
Логичней будет использовать готовую константу, а то мало ли Какому приспичит увеличить длину Ника
PHP:
GetPlayerName(playerid, PlayerInfo[playerid][pName], 24+1);
Вместо 24 MAX_PLAYER_NAME
 

Lionely

Участник форума
Пользователь
Регистрация
22 Июл 2013
Сообщения
365
Реакции
18
Почему нельзя в подобных "регистрациях" начать наконец-то использовать соль? И хоть какое-то хеширование пароля?
 

Valera_Kovshikov

Специалист
Пользователь
Регистрация
28 Сен 2013
Сообщения
754
Реакции
127

Nexius_Tailer

• Профик •
Регистрация
19 Май 2013
Сообщения
1,604
Реакции
749
Адрес
Гомель, Беларусь
Чтобы при краже базы или получении к ней хоть какого-то доступа нельзя было насолить всем клиентам сервера сразу имея перед глазами их голый пароль.
 

OKStyle

Адвокат по делам семейным
Регистрация
4 Мар 2011
Сообщения
3,816
Реакции
953
Возраст
31
Адрес
Оренбург
Проблема доступа к базе - проблема владельцев проекта или хостера, а проблема простого пароля - проблема юзера.
Получив доступ к базе, вероятно, можно получить доступ к amx, и, используя его, подбирать пароли с солью, вводя по словарю.
Поэтому использование соли ведёт только к ухудшению юзабилити базы.
 

SlimX

Участник форума
Пользователь
Регистрация
28 Июл 2012
Сообщения
436
Реакции
121
Адрес
Ростов-на-Дону
Это рофл чи шо? Лол, подбирать пароли с солью, сколько тебе понадобится лет для этого? Ну ты и высрал

---------- Сообщение добавлено в 02:07 ---------- Предыдущее сообщение добавлено в 01:49 ----------

Проблема доступа к базе - проблема владельцев проекта или хостера, а проблема простого пароля - проблема юзера.
Получив доступ к базе, вероятно, можно получить доступ к amx, и, используя его, подбирать пароли с солью, вводя по словарю.
Поэтому использование соли ведёт только к ухудшению юзабилити базы.
Находимся в шоке всей конфой с тебя
 

OKStyle

Адвокат по делам семейным
Регистрация
4 Мар 2011
Сообщения
3,816
Реакции
953
Возраст
31
Адрес
Оренбург
Если ты не умеешь думать, может, ты читать умеешь? Как да? Если бы да, то всё понял бы.
У вас там вся конфа думать не умеет, раз все в шоке. Найдите того, кто там у вас читать учился.
 
Последнее редактирование:

Nexius_Tailer

• Профик •
Регистрация
19 Май 2013
Сообщения
1,604
Реакции
749
Адрес
Гомель, Беларусь
Получив доступ к базе, вероятно, можно получить доступ к amx, и, используя его, подбирать пароли с солью, вводя по словарю.
Поэтому использование соли ведёт только к ухудшению юзабилити базы.
Суть соли как раз в том, чтобы она была уникальной для каждого аккаунта, и именно в этом случае подбор усложнится значительно и никакие общие таблицы для прогона по ним уже не помогут сделать это так быстро и для всех сразу.
 
Последнее редактирование:

OKStyle

Адвокат по делам семейным
Регистрация
4 Мар 2011
Сообщения
3,816
Реакции
953
Возраст
31
Адрес
Оренбург
Усложняет подбор, но не возможность подобрать его тем же методом, как и мод. Если владелец проекта солит пароли, потому что очкует за базу, то у меня слов нет... Значит он - рукожоп. А те, кто получит эту базу, могут ничего не расшифровывать, просто импортировать в свою базу аккаунтов. А при заходе игрока ему будет показывать, что аккаунт существует, и разрабы могут чекать введённый пароль в inputtext. Да, игроку покажет, что пароль не совпадает, потому что соли нет и алгоритм другой, но пароль в открытом виде уже будет получен.
 

SlimX

Участник форума
Пользователь
Регистрация
28 Июл 2012
Сообщения
436
Реакции
121
Адрес
Ростов-на-Дону
Усложняет подбор, но не возможность подобрать его тем же методом, как и мод. Если владелец проекта солит пароли, потому что очкует за базу, то у меня слов нет... Значит он - рукожоп. А те, кто получит эту базу, могут ничего не расшифровывать, просто импортировать в свою базу аккаунтов. А при заходе игрока ему будет показывать, что аккаунт существует, и разрабы могут чекать введённый пароль в inputtext. Да, игроку покажет, что пароль не совпадает, потому что соли нет и алгоритм другой, но пароль в открытом виде уже будет получен.
Перевожу высер: защитите нормально базу и можете хранить пароли в первозданном виде))))

---------- Сообщение добавлено в 19:02 ---------- Предыдущее сообщение добавлено в 18:57 ----------

Усложняет подбор, но не возможность подобрать его тем же методом, как и мод. Если владелец проекта солит пароли, потому что очкует за базу, то у меня слов нет... Значит он - рукожоп. А те, кто получит эту базу, могут ничего не расшифровывать, просто импортировать в свою базу аккаунтов. А при заходе игрока ему будет показывать, что аккаунт существует, и разрабы могут чекать введённый пароль в inputtext. Да, игроку покажет, что пароль не совпадает, потому что соли нет и алгоритм другой, но пароль в открытом виде уже будет получен.
Каким образом соль влияет на юзабилити базы?) ответь мне, лучший павн кодер мира
 

Nexius_Tailer

• Профик •
Регистрация
19 Май 2013
Сообщения
1,604
Реакции
749
Адрес
Гомель, Беларусь
Усложняет подбор, но не возможность подобрать его тем же методом, как и мод. Если владелец проекта солит пароли, потому что очкует за базу, то у меня слов нет... Значит он - рукожоп. А те, кто получит эту базу, могут ничего не расшифровывать, просто импортировать в свою базу аккаунтов. А при заходе игрока ему будет показывать, что аккаунт существует, и разрабы могут чекать введённый пароль в inputtext. Да, игроку покажет, что пароль не совпадает, потому что соли нет и алгоритм другой, но пароль в открытом виде уже будет получен.
Ты для этого ещё должен будешь каждого игрока дождаться и выловить, что гораздо дольше и сложнее, чем если ты те же самые пароли бы тупо увидел в исходном виде (очевидные ж вроде вещи). Ясное дело, что не стоит делать прецедентов и допускать возможность её попадания в чужие руки, но если это как-то произошло, так хотя бы шансов на то, что пострадают ещё и все 100% игроков, гораздо меньше.

---------- Сообщение добавлено в 21:45 ---------- Предыдущее сообщение добавлено в 21:42 ----------

UPD: если злоумышленник получает доступ и к бд, и к моду, и вообще всё у него в руках, так может сразу и исходники самого мода в отрытом виде лить на хост? Логика доступности данных здесь одинаковая получается. Да и сервер при желании ведь и так и так твой запустить у себя сможет, и скопировать из мода что-либо с определёнными усилиями тоже... Зачем тогда всё ему усложнять?
 
Последнее редактирование:

SlimX

Участник форума
Пользователь
Регистрация
28 Июл 2012
Сообщения
436
Реакции
121
Адрес
Ростов-на-Дону
Ты для этого ещё должен будешь каждого игрока дождаться и выловить, что гораздо дольше и сложнее, чем если ты те же самые пароли бы тупо увидел в исходном виде (очевидные ж вроде вещи). Ясное дело, что не стоит делать прецедентов и допускать возможность её попадания в чужие руки, но если это как-то произошло, так хотя бы шансов на то, что пострадают ещё и все 100% игроков, гораздо меньше.

---------- Сообщение добавлено в 21:45 ---------- Предыдущее сообщение добавлено в 21:42 ----------

UPD: если злоумышленник получает доступ и к бд, и к моду, и вообще всё у него в руках, так может сразу и исходники самого мода в отрытом виде лить на хост? Логика доступности данных здесь одинаковая получается. Да и сервер при желании ведь и так и так твой запустить у себя сможет, и скопировать из мода что-либо с определёнными усилиями тоже... Зачем тогда всё ему усложнять?
Да он сам себе противоречит =)
 

Команда форума онлайн

Реклама

shape1
shape2
shape3
shape4
shape7
shape8
Сверху