[Ajuda] PWN + Mysql (R7)
#1

Boa tarde amigos!

Eu estou aprendendo a criar um servidor PWN, tenho algumas noзхes de ediзгo mas й meu primeiro projeto do zero.
Nunca mexi em PHP e Mysql e aproveitei para estuda-lo tambйm.

Antes que me critiquem por aprender mais uma linguagem de uma sу vez, gostaria que fizessem crнticas POSITIVAS e nгo INЪTEIS.

Achei 2 tutoriais em portuguкs aqui no fуrum SAMP, o primeiro estava com alguns erros que eu comentei mas como o tutorial era antigo nгo consegui tirar minhas dъvidas. Consegui entender e acertar alguns erros.
O segundo tutorial era para um Filterscript que fazia praticamente a mesma coisa que o outro, sу que o primeiro tinha a necessidade de entrar no servidor Mysql, criar o banco de dados e a tabela, jб este segundo sу precisava do login e senha para acessar o banco de dados e ele mesmo criava a tabela, caso nгo existi-se.

Este segundo tutorial me mostrou mais cуdigos Mysql, como foi o caso do mysql_ping que verifica a comunicaзгo com o servidor. O problema й que eu nunca conseguia me conectar ao host, atй troquei de host mas o problema continuou.
No segundo host eu notei que estava tudo correto, criei uma pбgina em PHP para verificar o acesso ao banco de dados e estava perfeito, ou seja, o problema era no SAMP.

Achei entгo um terceiro tutorial, diferente dos outros este usava o R7 e nгo versхes anteriores, mas foi fora daqui, achei ele mais completo, sу inclui o mysql_ping para verificar a comunicaзгo com o Host, igual ao segundo tutorial.
Bom, o problema й que continuo nгo conseguindo me conectar ao Host pelo SAMP.

if( mysql_ping( ) >= 1 ) print( "=> Conectado ao Banco de Dados" );
else print( "=> Incapaz de conectar ao banco de dados\n=> FS descarregado" );

Sempre da incapaz de conectar ao banco de dados.
O host, usuбrio, senha e banco de dados estгo corretos, como jб disse, consigo acessar por uma pбgina PHP que criei para fazer o teste.

Que raios pode ser isso?

Eu consigo entrar no servidor mas como da esse erro simplesmente nгo aparece a tela de login.

Alguйm pode me ajudar?
Reply
#2

Manda os tutoriais, o segundo e o terceiro de preferкncia.
Reply
#3

Eu vi vocк naquele tуpico de um FS com MySql se nгo me engano, bom, vamos lб...
Vocк tem skype amigo ?
gostaria que vocк me adicionasse e ai eu poderia tentar te ajudar e entender melhor oque estб acontecendo.
Skype: willian_luigi
Reply
#4

Quote:
Originally Posted by Willian_Luigi
Посмотреть сообщение
Eu vi vocк naquele tуpico de um FS com MySql se nгo me engano, bom, vamos lб...
Vocк tem skype amigo ?
gostaria que vocк me adicionasse e ai eu poderia tentar te ajudar e entender melhor oque estб acontecendo.
Skype: willian_luigi
Acabei de te Adicionar porйm existem uns 5 com o nome parecido, peguei o primeiro, vocк de cara para a WEBCAM fazendo _|_ hehehe
Reply
#5

Antes era a mesma foto do fуrum, mas eu tinha desistido de samp por causa do trabalho ai acabei mudando. haha
Reply
#6

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


Forum Jump:


Users browsing this thread: 1 Guest(s)