PDA

Просмотр полной версии : [Вопрос] Пустое поле в "password" MySQL



Nurick
26.12.2015, 01:10
Здравствуйте!
Суть вопроса такова в базе данных не отображается пароль, само поле пустое! Регистрируется аккаунт далее после перезахода возможно зайти с любым паролем так как поле в "password" пустое.


switch(dialogid)
{
case 0:
{
if(!response)
{
SendClientMessage(playerid, 0xFFB02EFF, "Введите \"/q\" (/quit) для выхода");
return _Kick(playerid);
}
if(!strlen(inputtext)) return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Регистрация", "\tДобро пожаловать на Davenport RolePlay!\nНеобходимо пройти регистрацию\nПридумайте пароль, он будет запрашиваться каждый раз при входе\
\n\n\tПримечание:\n\t1.Пароль чувствителен к регистру\n\t2.Длина пароля от 6 до 129 символов\n\t3.Может содержать любые символы, знаки а также цифры", "Готово", "Отмена");
else if(strlen(inputtext) < 6 || strlen(inputtext) > 129) return ShowPlayerDialog(playerid, 2, DIALOG_STYLE_MSGBOX, "Уведомление", "Ошибка ввода пароля!\nДлина пароля от 6 до 129 символов", "Повторить", "");
WP_Hash(Player[playerid][Password], 129, inputtext);
new query[128];
mysql_format(connectMySQL, query, sizeof(query), "INSERT INTO `players` (`name`, `password`) VALUES ('%e', '%s')", Player[playerid][Name], Player[playerid][Password]);
mysql_tquery(connectMySQL, query, "OnPlayerRegister", "d", playerid);
return 1;
}
case 1:
{
if(!response)
{
SendClientMessage(playerid, 0xFFB02EFF, "Введите \"/q\" (/quit) для выхода");
return _Kick(playerid);
}
if(!strlen(inputtext))
{
new string[107+MAX_PLAYER_NAME];
format(string, sizeof(string), "\tДобро пожаловать на Davenport RolePlay!\nДанный аккаунт уже зарегистрирован\n\nЛогин: %s\nВведите пароль:", Player[playerid][Name]);
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", string, "Войти", "Отмена");
return 1;
}
new WP_string[129];
WP_Hash(WP_string, sizeof(WP_string), inputtext);
if(!strcmp(WP_string, Player[playerid][Password]))
{
new query[128];
mysql_format(connectMySQL, query, sizeof(query), "SELECT * FROM `players` WHERE `name` = '%e'", Player[playerid][Name]);
mysql_tquery(connectMySQL, query, "OnPlayerLogin", "d", playerid);
}
else
{
SetPVarInt(playerid, "invalid", GetPVarInt(playerid, "invalid") +1);
if(GetPVarInt(playerid, "invalid") == 4)
{
SendClientMessage(playerid, 0xFFB02EFF, "Введите \"/q\" (/quit) для выхода");
return _Kick(playerid);
}
new string[107+MAX_PLAYER_NAME+39];
format(string, sizeof(string), "\tДобро пожаловать на Davenport RolePlay!\nДанный аккаунт уже зарегистрирован\n\nЛогин: %s\nВведите пароль:\nНеверный пароль! Осталось попыток: %d", Player[playerid][Name], 4 - GetPVarInt(playerid, "invalid"));
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", string, "Войти", "Отмена");
return 1;
}
return 1;
}
case 2: return ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Регистрация", "\tДобро пожаловать на Davenport RolePlay!\nНеобходимо пройти регистрацию\nПридумайте пароль, он будет запрашиваться каждый раз при входе\
\n\n\tПримечание:\n\t1.Пароль чувствителен к регистру\n\t2.Длина пароля от 6 до 129 символов\n\t3.Может содержать любые символы, знаки а также цифры", "Готово", "Отмена");
}

public OnPlayerDataLoaded(playerid)
{
if(cache_num_rows() == 1)
{
new string[107+MAX_PLAYER_NAME];
format(string, sizeof(string), "\tДобро пожаловать на Davenport RolePlay!\nДанный аккаунт уже зарегистрирован\n\nЛогин: %s\nВведите пароль:", Player[playerid][Name]);
ShowPlayerDialog(playerid, 1, DIALOG_STYLE_INPUT, "Авторизация", string, "Войти", "Отмена");
Player[playerid][ID] = cache_get_field_content_int(0, "id");
cache_get_field_content(0, "password", Player[playerid][Password], connectMySQL, 129);
}
else
{
ShowPlayerDialog(playerid, 0, DIALOG_STYLE_INPUT, "Регистрация", "\tДобро пожаловать на Davenport RolePlay!\nНеобходимо пройти регистрацию\nПридумайте пароль, он будет запрашиваться каждый раз при входе\
\n\n\tПримечание:\n\t1.Пароль чувствителен к регистру\n\t2.Длина пароля от 6 до 129 символов\n\t3.Может содержать любые символы, знаки а также цифры", "Готово", "Отмена");
}
return 1;
}


public OnPlayerRegister(playerid)
{
Player[playerid][ID] = cache_insert_id();
SpawnPlayer(playerid);
return 1;
}


public OnPlayerLogin(playerid)
{
SpawnPlayer(playerid);
return 1;
}
http://ihost.pro-pawn.ru/image.php?di=43PL

http://ihost.pro-pawn.ru/image.php?di=5997

$continue$
26.12.2015, 02:13
Как в Player[playerid][Password] записывается пароль?

Daniel_Cortez
26.12.2015, 09:41
Как в Player[playerid][Password] записывается пароль?
Не пароль, а хеш.


WP_Hash(Player[playerid][Password], 129, inputtext);
Правда, настораживает "магическое число" 129. Обычно размер буфера выражают либо через sizeof, либо через константу (которая используется для указания размера массива при его объявлении).

Теперь рассуждаем логически. Функция WP_Hash возвращает хеш от указанной строки. Длина хеша всегда составляет 128+1 символов.
И куда же записыается этот хеш?


new query[128];
Скорее всего, mysql_format просто пропускает хеш при форматировании, т.к. его длина больше длины форматного буфера.

Nurick
26.12.2015, 10:06
А теперь вообще вместо пустого поля у нас появляется в поле password "0"


WP_Hash(Player[playerid][Password], 129, inputtext);
new query[256/*произвольно*/];
mysql_format(connectMySQL, query, sizeof(query), "INSERT INTO `players` (`name`, `password`) VALUES ('%e', '%s')", Player[playerid][Name], Player[playerid][Password]);
mysql_tquery(connectMySQL, query, "OnPlayerRegister", "d", playerid);

http://ihost.pro-pawn.ru/image.php?di=ZHI3

Daniel_Cortez
26.12.2015, 10:27
Прологируйте значение в Player[playerid][Password] после того, как получите хеш. И текст запроса после форматирования тоже.

Nurick
26.12.2015, 20:52
Тему можно закрывать, проблема решена. Спасибо "Daniel_Cortez" за верный путь направления


Скорее всего, mysql_format просто пропускает хеш при форматировании, т.к. его длина больше длины форматного буфера.