[Ajuda] PWN + Mysql (R7) - ERRO NO LOGIN!
#1

Willian_Luigi me ajudou a descobrir o problema, agradeзo sua ajuda!

Perdemos 1 dia inteiro para reparar que os "host" gratuitos que eu utilizava nгo aceitavam acesso remoto ao banco de dados.

Agora o problema й outro.

Eu continuei me baseando no terceiro tutorial que para mim foi o mais completo.
Fiz as alteraзхes necessбrias aos poucos.

Vamos aos problemas:

1 - Dentro do BANCO DE DADOS que eu escolhi, o GAME MODE cria uma tabela chamada USERS caso ela nгo exista e lб faz as movimentaзхes necessбrias para LOGIN, etc.
O BANCO DE DADOS eu posso alterar toda hora que nгo da problema, posso colocar qualquer nome, ele aceita, basta existir no LOCAL HOST.
Agora, minha primeira alteraзгo foi o nome da TABELA que era USERS. Alterei para TABELAUSUARIOS e quando eu entrava no SAMP ele nгo mostrava a tela de LOGIN ou REGISTRO. Mas no BANCO DE DADOS a TABELA era criada perfeitamente.
Verifiquei se nгo havia alterado alguma linha referente ao antigo nome da TABELA e reparei que estava tudo certo.
Troquei novamente o nome da TABELA e coloque USUARIOS.
Feito isso o LOGIN e REGISTRO apareciam.

2 - Eu consigo me REGISTRAR porйm nгo consigo me LOGAR, ele informa que a senha esta incorreta.
Na TABELA o usuбrio й criado perfeitamente sу que a senha fica encriptografada, como eu imaginava.
Eu saio do SAMP, entro novamente, independente de fechar e reabrir o servidor, quando eu entro no SAMP o servidor repara que a minha conta RAPHAEL_MARQUES jб existe e ao invйs de pedir uma senha para CADASTRO ele pede a senha para o LOGIN.
Quando eu digito a senha ele diz que estб errada.
Jб tentei colocar senha sу de nъmeros (12345) e sу de letras (gtasa), sempre da o mesmo erro.
A minha senha normalmente pega letras e nъmeros e tem mais de 10 dнgitos e tambйm da erro.

Segue abaixo o cуdigo do GM.

Код:
#include <a_samp>
#include <a_mysql>
#include <easydialog>
#include <Dini>

//-----------------------------------------------------

#define		MAX_LOG_TRIES		(4)
#define		MAX_PASS_LENGTH		(40)

#define     NEWB_SKIN			(299) // claude's skin

/* MySQL Credentials */
#define 	SQL_HOST 			"127.0.0.1"
#define 	SQL_USER 			"root"	
#define 	SQL_PASS 			""
#define 	SQL_DB 	 			"gtasareallife"

/* Used for position arrays */
#define		posArr{%0}		%0[0], %0[1], %0[2]   
#define		posArrEx{%0}	%0[0], %0[1], %0[2], %0[3]

//-----------------------------------------------------

native WP_Hash(buffer[], len, const str[]);

//-----------------------------------------------------

/* Credits to RyDeR` */
stock randomString(strDest[], strLen = 30)
{
    while(strLen--)
        strDest[strLen] = random(2) ? (random(26) + (random(2) ? 'a' : 'A')) : (random(10) + '0');
}

//-----------------------------------------------------

static Float:g_newbSpawn[4] = {1815.2614,-1369.6233,15.0781,270.4365};

enum e_pInfo
{
	pSQLid,
	pPass[129],
	pSalt[30],
    Float:pHealth,
    Float:pArmour,
	Float:pPos[4],
	pInterior,
	pVirtualWorld,
	pSkin
}

new 
	g_PlayerInfo[MAX_PLAYERS][e_pInfo],
	g_Logged[MAX_PLAYERS],
	g_LogTries[MAX_PLAYERS],
	g_Died[MAX_PLAYERS],
	g_Handle;

//-----------------------------------------------------

//main(){}

#if defined FILTERSCRIPT

public OnFilterScriptInit()
{
	print("\n--------------------------------------");
	print(" SAN ANDREAS");
	print("--------------------------------------\n");
	return 1;
}

public OnFilterScriptExit()
{
	return 1;
}

#else

main()
{
	print("\n----------------------------------");
	print("     SAN ANDREAS REAL LIFE\nCriado por Raphael Marques Garcia");
	print("----------------------------------\n");
}

#endif

//-----------------------------------------------------

public OnGameModeInit()
{	
	SetGameModeText("REAL LIFE");
	UsePlayerPedAnims();
	DisableInteriorEnterExits();
	
	mySQL_init();
	TextDraws_Init();
    return 1;
}

public OnGameModeExit()
{
	mysql_close(g_Handle); 
    return 1;
}

//-----------------------------------------------------

stock mySQL_init()
{
	mysql_debug(1); 
	g_Handle = mysql_connect(SQL_HOST, SQL_USER, SQL_DB, SQL_PASS);
	if( mysql_ping() >= 1 ) print("\n----------------------------------\n   Conectado ao banco de dados!\n----------------------------------");
	else print("\n----------------------------------\n   Impossнvel conectar ao banco de dados!\n----------------------------------\n");
	/* Table Structure - kind of messy, I know. */
	/*mysql_function_query(g_Handle, "CREATE TABLE IF NOT EXISTS `usuarios` ( \
		`id` int(11) NOT NULL AUTO_INCREMENT, \
		`name` varchar(30) NOT NULL, \
		`pass` varchar(30) NOT NULL, \
		`salt` varchar(30) NOT NULL, \
		`health` float NOT NULL, \
		`armour` float NOT NULL, \
		`X` float NOT NULL, \
		`Y` float NOT NULL, \
		`Z` float NOT NULL, \
		`A` float NOT NULL, \
		`interior` int(2) NOT NULL, \
		`vw` int(11) NOT NULL, \
		`skin` int(3) NOT NULL, \
		PRIMARY KEY (`id`) \
	)", false, "SendQuery", "");*/

	return 0x01;
}

forward SendQuery();
public SendQuery()
{
	// callback for queries that don't fetch data
	return 1;
}

//-----------------------------------------------------

public OnPlayerConnect(playerid)
{
	// Deletar Objetos indesejбveis que existem no GTA SAN ANDREAS
	RemoveBuildingForPlayer(playerid, 4229, 1597.9063, -1699.7500, 30.2109, 0.25);
	RemoveBuildingForPlayer(playerid, 4230, 1597.9063, -1699.7500, 30.2109, 0.25);
	RemoveBuildingForPlayer(playerid, 4236, 1387.0313, -1715.0234, 30.4141, 0.25);
	RemoveBuildingForPlayer(playerid, 4235, 1387.0313, -1715.0234, 30.4141, 0.25);
	RemoveBuildingForPlayer(playerid, 4239, 1407.9063, -1407.3984, 33.9844, 0.25);
	RemoveBuildingForPlayer(playerid, 1229, 1466.4844, -1598.0938, 14.1094, 0.25);
	RemoveBuildingForPlayer(playerid, 1229, 1498.0547, -1598.0938, 14.1094, 0.25);
	RemoveBuildingForPlayer(playerid, 6003, 954.6875, -1305.7734, 30.1406, 0.25);
	RemoveBuildingForPlayer(playerid, 5818, 954.6875, -1305.7734, 30.1406, 0.25);
	
	ToggleMainMenu(playerid, 1);
	SetTimerEx("SafeOnPlayerConnect", 250, 0, "d", playerid);
    return 1;
}

forward SafeOnPlayerConnect(playerid);
public SafeOnPlayerConnect(playerid)
{
	g_Logged[playerid] = 255;
	g_LogTries[playerid] = 0;
	g_Died[playerid] = 0;
	
	SetSpawnInfo(playerid, 0, NEWB_SKIN, posArr{g_newbSpawn}-4.0, 0.0, 0, 0, 0, 0, 0, 0);
	SpawnPlayer(playerid);
	
	ToggleMainMenu(playerid, 1);
	CheckAccount(playerid);
	return 1;
}

public OnPlayerDisconnect(playerid, reason)
{
	SaveAccount(playerid);
	return 1;
}

public OnPlayerSpawn(playerid)
{	
	if(g_Logged[playerid] == 255) {
		g_Logged[playerid] = 0;
		clearScreen(playerid);
		
		SetPlayerCameraPos(playerid, posArr{g_newbSpawn});
		SetPlayerCameraLookAt(playerid, posArr{g_newbSpawn});
	}
	
	if(g_Died[playerid]) {
		SetCameraBehindPlayer(playerid);
		SetPlayerPos(playerid, posArr{g_newbSpawn});
		SetPlayerFacingAngle(playerid, g_newbSpawn[3]);
	}
	return 1;
}

public OnPlayerDeath(playerid, killerid, reason)
{
	g_Died[playerid] = 1;
	return 1;
}
//-----------------------------------------------------

stock CheckAccount(playerid)
{
	new query[82];
	
	format(query, sizeof(query), "SELECT id, pass, salt FROM `usuarios` WHERE `name` = '%s' LIMIT 1", returnName(playerid));
	mysql_function_query(g_Handle, query, true, "OnAccountCheck", "d", playerid);
	return 1;
}

forward OnAccountCheck(playerid);
public OnAccountCheck(playerid)
{
	if(playerid != INVALID_PLAYER_ID) { // if the player is still connected
	
		new rows, fields;
		cache_get_data(rows, fields, g_Handle); 
		
		if(rows) {
			new 
				id[30];
				
			cache_get_row(0, 0, id, g_Handle);  g_PlayerInfo[playerid][pSQLid] = strval(id);
			cache_get_row(0, 1, g_PlayerInfo[playerid][pPass], g_Handle);
			cache_get_row(0, 2, g_PlayerInfo[playerid][pSalt], g_Handle);
			
			ShowDialog(playerid, Show:<Login>, DIALOG_STYLE_PASSWORD, "{1564F5}LOGIN", "Digite sua senha para LOGAR", "OK", "SAIR");
		}
		
		else {
			ShowDialog(playerid, Show:<Register>, DIALOG_STYLE_PASSWORD, "{1564F5}CADASTRO", "Digite uma senha para fazer o CADASTRO.", "OK", "SAIR");
		}
	}
	return 1;
}

//-----------------------------------------------------

Dialog:Login(playerid, response, listitem, inputtext[])
{
	if(!response || !strlen(inputtext)) {
		return ShowDialog(playerid, Show:<Login>, DIALOG_STYLE_PASSWORD, "{1564F5}LOGIN", "Digite sua senha para LOGAR", "OK", "SAIR");
	}
	
	new 
		hashedinput[129];
	
	format(hashedinput, sizeof(hashedinput), "%s%s", g_PlayerInfo[playerid][pSalt], inputtext);
	WP_Hash(hashedinput, 129, hashedinput);
	
	if(strcmp(hashedinput, g_PlayerInfo[playerid][pPass])) {
		g_LogTries[playerid]++;
		
		if(g_LogTries[playerid] == MAX_LOG_TRIES) {
			return SendClientMessage(playerid, -1, "ADMIN: Limite de 30 caracteres!"), Kick(playerid);
		}
		
		SendClientMessage(playerid, -1, "{FF0000}ADMIN: SENHA INCORRETA!"),
		ShowDialog(playerid, Show:<Login>, DIALOG_STYLE_PASSWORD, "{1564F5}LOGIN", "Digite sua senha para LOGAR", "OK", "SAIR");
	}
	else {
		LoadAccount(playerid);
	}
	return 1;
}

stock LoadAccount(playerid)
{
	new query[128];
	
	format(query, sizeof(query), "SELECT * FROM `usuarios` WHERE `id` = %d", g_PlayerInfo[playerid][pSQLid]);
	mysql_function_query(g_Handle, query, true, "OnAccountLoad", "d", playerid);
}

forward OnAccountLoad(playerid);
public OnAccountLoad(playerid)
{
	ToggleMainMenu(playerid, 0);
	SetCameraBehindPlayer(playerid);
	
	new temp[40];
	format(temp, sizeof(temp), "{2F991A}ADMIN: {1564F5}Bem vindo,{FFFFFF} %s", returnNameEx(playerid));
	SendClientMessage(playerid, -1, temp);

	
	cache_get_row(0, 4, temp), g_PlayerInfo[playerid][pHealth] = floatstr(temp),
	cache_get_row(0, 5, temp), g_PlayerInfo[playerid][pPos][0] = floatstr(temp),
	cache_get_row(0, 6, temp), g_PlayerInfo[playerid][pPos][1] = floatstr(temp),
	cache_get_row(0, 7, temp), g_PlayerInfo[playerid][pPos][2] = floatstr(temp),
	cache_get_row(0, 8, temp), g_PlayerInfo[playerid][pPos][3] = floatstr(temp),
	cache_get_row(0, 9, temp), g_PlayerInfo[playerid][pInterior] = strval(temp),
	cache_get_row(0, 10, temp), g_PlayerInfo[playerid][pVirtualWorld] = strval(temp),
	cache_get_row(0, 11, temp), g_PlayerInfo[playerid][pSkin] = strval(temp);
	cache_get_row(0, 12, temp), g_PlayerInfo[playerid][pArmour] = floatstr(temp),

	SetPlayerHealth(playerid, g_PlayerInfo[playerid][pHealth]);	
	SetPlayerArmour(playerid, g_PlayerInfo[playerid][pArmour]);
	SetPlayerPos(playerid, posArr{g_PlayerInfo[playerid][pPos]});
	SetPlayerFacingAngle(playerid, g_PlayerInfo[playerid][pPos][3]);
	SetPlayerInterior(playerid, g_PlayerInfo[playerid][pInterior]);
	SetPlayerVirtualWorld(playerid, g_PlayerInfo[playerid][pVirtualWorld]);
	SetPlayerSkin(playerid, g_PlayerInfo[playerid][pSkin]);
	return 1;
}

//-----------------------------------------------------

Dialog:Register(playerid, response, listitem, inputtext[]) 
{
	if(!response) {
		return SendClientMessage(playerid, -1, "{2F991A}ADMIN: Vocк se conectou ao servidor."), Kick(playerid);
	}
	
	if(isnull(inputtext)) {
		return ShowDialog(playerid, Show:<Register>, DIALOG_STYLE_PASSWORD, "{1564F5}CADASTRO", "Digite uma senha para se cadastrar.", "OK", "SAIR");
	}
	
	if(strlen(inputtext) >= MAX_PASS_LENGTH) {
		return SendClientMessage(playerid, -1, "ADMIN: A senha nгo pode ter mais de 30 caracteres!"), ShowDialog(playerid, Show:<Register>, DIALOG_STYLE_PASSWORD, "{1564F5}Register", "Type in a password below to register an account.", "Okay", "Cancel");
	}
	
	new 
		Salt[30],
		hash[129];
	
	randomString(Salt, 30);
	format(hash, sizeof(hash), "%s%s", Salt, inputtext);
	
	WP_Hash(hash, sizeof(hash), hash);
	CreateAccount(playerid, Salt, hash);
	
	format(hash, sizeof(hash), "{2F991A}ADMIN: {1564F5}Bem vindo,{FFFFFF} %s", returnNameEx(playerid));
	SendClientMessage(playerid, -1, hash);
	
	g_PlayerInfo[playerid][pSkin] = NEWB_SKIN;
	
	ToggleMainMenu(playerid, 0);
	SetCameraBehindPlayer(playerid);
	SetPlayerPos(playerid, posArr{g_newbSpawn});
	SetPlayerFacingAngle(playerid, g_newbSpawn[3]);
	SetPlayerSkin(playerid, NEWB_SKIN);	
	return 1;
}

//-----------------------------------------------------

stock CreateAccount(playerid, salt[], pass[129])
{
	new query[240];
	format(query, sizeof(query), "INSERT INTO `usuarios` (name, salt, pass) VALUES (\'%s\', \'%s\', \'%s\')",
		returnName(playerid),
		salt,
		pass
	);
	
	mysql_function_query(g_Handle, query, false, "OnAccountCreate", "d", playerid);
}

forward OnAccountCreate(playerid);
public OnAccountCreate(playerid)
{
	g_PlayerInfo[playerid][pSQLid] = mysql_insert_id();
	return 1;
}

stock SaveAccount(playerid)
{
	new 
		query[300],
		Float:pos[4],
		Float:health,
		Float:armour;
	
	GetPlayerPos(playerid, posArr{pos});
	GetPlayerFacingAngle(playerid, pos[3]);
	GetPlayerHealth(playerid, health);
	GetPlayerArmour(playerid, armour);
	
	format(query, sizeof(query), "UPDATE `usuarios` SET health = %.1f, armour = %.1f, X = %.2f, Y = %.2f, Z = %.2f, A = %.2f, interior = %d, vw = %d, skin = %d WHERE `id` = %d",
		health,
		armour,
		posArrEx{pos},
		GetPlayerInterior(playerid),
		GetPlayerVirtualWorld(playerid),
		GetPlayerSkin(playerid),
		g_PlayerInfo[playerid][pSQLid]
	);
	
	mysql_function_query(g_Handle, query, false, "SendQuery", "");
	return 1;
}

//-----------------------------------------------------

stock returnName(playerid)
{
	new name[24];
	GetPlayerName(playerid, name, 24);
	return name;
}

stock returnNameEx(playerid)
{
	new name[24];
	GetPlayerName(playerid, name, 24);
	
	for(new x=0; x<24; x++) {
		if(name[x] == '_') {
			name[x] = ' ';
		}
	}

	return name;
}

stock clearScreen(playerid)
{
	for(new i; i<100; i++) {
		SendClientMessage(playerid, -1, "");
	}
	return 1;
}

//-----------------------------------------------------

new
	Text:MainMenu[4];

stock TextDraws_Init()
{	
	/* Bottom Bar */
	MainMenu[0] = TextDrawCreate(250.000000, 343.000000, "~n~~n~~n~~n~~n~~n~");
	TextDrawAlignment(MainMenu[0], 2);
	TextDrawBackgroundColor(MainMenu[0], 255);
	TextDrawFont(MainMenu[0], 1);
	TextDrawLetterSize(MainMenu[0], 1.000000, 2.000000);
	TextDrawColor(MainMenu[0], -16776961);
	TextDrawSetOutline(MainMenu[0], 1);
	TextDrawSetProportional(MainMenu[0], 1);
	TextDrawUseBox(MainMenu[0], 1);
	TextDrawBoxColor(MainMenu[0], 255);
	TextDrawTextSize(MainMenu[0], 90.000000, 803.000000);

	/* Top Bar */
	MainMenu[1] = TextDrawCreate(250.000000, -12.000000, "~n~~n~~n~~n~~n~~n~");
	TextDrawAlignment(MainMenu[1], 2);
	TextDrawBackgroundColor(MainMenu[1], 255);
	TextDrawFont(MainMenu[1], 1);
	TextDrawLetterSize(MainMenu[1], 1.000000, 2.000000);
	TextDrawColor(MainMenu[1], -16776961);
	TextDrawSetOutline(MainMenu[1], 1);
	TextDrawSetProportional(MainMenu[1], 1);
	TextDrawUseBox(MainMenu[1], 1);
	TextDrawBoxColor(MainMenu[1], 255);
	TextDrawTextSize(MainMenu[1], 90.000000, 918.000000);

	/* Top Colored Bar */
	MainMenu[2] = TextDrawCreate(729.000000, 99.000000, "_");
	TextDrawBackgroundColor(MainMenu[2], 255);
	TextDrawFont(MainMenu[2], 1);
	TextDrawLetterSize(MainMenu[2], 50.000000, 0.099999);
	TextDrawColor(MainMenu[2], -16776961);
	TextDrawSetOutline(MainMenu[2], 0);
	TextDrawSetProportional(MainMenu[2], 1);
	TextDrawSetShadow(MainMenu[2], 1);
	TextDrawUseBox(MainMenu[2], 1);
	TextDrawBoxColor(MainMenu[2], 0x1564F5FF);
	TextDrawTextSize(MainMenu[2], -5.000000, 1031.000000);

	/* Bottom Colored Bar */
	MainMenu[3] = TextDrawCreate(729.000000, 340.000000, "_");
	TextDrawBackgroundColor(MainMenu[3], 255);
	TextDrawFont(MainMenu[3], 1);
	TextDrawLetterSize(MainMenu[3], 50.000000, 0.099999);
	TextDrawColor(MainMenu[3], -16776961);
	TextDrawSetOutline(MainMenu[3], 0);
	TextDrawSetProportional(MainMenu[3], 1);
	TextDrawSetShadow(MainMenu[3], 1);
	TextDrawUseBox(MainMenu[3], 1);
	TextDrawBoxColor(MainMenu[3], 0x1564F5FF);
	TextDrawTextSize(MainMenu[3], -5.000000, 1031.000000);
	return 1;
}

stock ToggleMainMenu(playerid, toggle)
{
	for(new i=0; i<sizeof(MainMenu); i++) {
		if(toggle) {
			TextDrawShowForPlayer(playerid, MainMenu[i]);
			TogglePlayerControllable(playerid, 0);
		}
		
		else {
			TextDrawHideForPlayer(playerid, MainMenu[i]);
			TogglePlayerControllable(playerid, 1);
		}
	}
	return 1;
}
Reply
#2

Quote:
Originally Posted by raphaelmarquesgarcia
Посмотреть сообщение
2 - Eu consigo me REGISTRAR porйm nгo consigo me LOGAR, ele informa que a senha esta incorreta.
Na TABELA o usuбrio й criado perfeitamente sу que a senha fica encriptografada, como eu imaginava.
Eu saio do SAMP, entro novamente, independente de fechar e reabrir o servidor, quando eu entro no SAMP o servidor repara que a minha conta RAPHAEL_MARQUES jб existe e ao invйs de pedir uma senha para CADASTRO ele pede a senha para o LOGIN.
Quando eu digito a senha ele diz que estб errada.
Jб tentei colocar senha sу de nъmeros (12345) e sу de letras (gtasa), sempre da o mesmo erro.
A minha senha normalmente pega letras e nъmeros e tem mais de 10 dнgitos e tambйm da erro.

Boas, й uma pena ver que ninguйm se pronunciou aqui ainda...

Como te falei nгo manjo muito desses paranauкs, mas assim, posso te dar um mini protуcolo pra vocк seguir,
ai vocк vai conseguir ajeitar essa parte da senha.

A questгo й essa, vocк nгo estб conseguindo estabelecer uma comparaзгo entre 2 strings...

Armazenada x Inputtext.

O que eu te recomendo fazer ?
1 - Verificar no banco se a senha estб salvando da forma CORRETA e como vocк digitou.
2 - Verificar se a criptografia do jeito que vocк aplicou nгo estб atrapalhando a comparaзгo.
3 - Verificar a lуgica do cуdigo, vocк pode nгo estar buscando os dados corretamente do banco
e/ou comparando direito...

Caso esses 3 passos nгo demonstrem nenhuma anomalia, te recomendo tirar a criptografia por um tempo
e testar como se tivesse comparando strings normais.

Banco(armazenada) x Inputtext(digitado), 100% de chance de vocк conseguir consertar esse seu erro,
porйm vai dar um pouco de trabalho...

Espero ter ajudado, como jб te falei, estou com uns probleminhas....
Entгo ficarei off no skype por um tempo.
Reply
#3

Eu ajustei o banco de dados para uma configuraзгo diferente, igual a outro tutorial, mas nгo adiantou.

Tentei entгo criar a senha diretamente no Mysql e entrar no SAMP mas deu o mesmo erro. Mesmo se eu criasse no SAMP e alterasse no Mysql.

Tentei senha sу de LETRAS e depois sу de NЪMEROS mas nгo deu certo.

O engraзado й que ele cria o usuбrio e quando isso acontece vocк consegue entrar no servidor, jб que ele sу pede a senha para se REGISTRAR e nгo para LOGAR. Ele sу pede senha para LOGAR a partir da segunda entrada no servidor, ai que da problema.

A ъnica coisa que eu implementei nele foi o COLETE, ia fazer os testes mas nгo adiantou por causa deste erro.
Reply
#4

O servidor salva tudo, atй se eu perder sangue ele salva, realmente muda, mas quando tento LOGAR pela primeira vez, ou seja, quando entro no servidor pela SEGUNDA vez nгo consigo jogar porque ele fala que a senha digitada estб errada.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)