Portal SAMP
[Ajuda] Login Textdraw - Versão de Impressão

+- Portal SAMP (https://portalsamp.com)
+-- Fórum: SA-MP (https://portalsamp.com/forumdisplay.php?fid=5)
+--- Fórum: Área de suporte (https://portalsamp.com/forumdisplay.php?fid=6)
+--- Tópico: [Ajuda] Login Textdraw (/showthread.php?tid=5146)



Login Textdraw - RosaScripter - 18/11/2025

Pessoal atualmente ando conhecendo minhas habilidades com o samp e recordando algumas funções mais utilizadas, mas estou tendo dor de cabeça em meu sistema de login/registro em textdraw que eu mesmo não consigo achar o erro.. no meu ver está tudo perfeito deixarei o código abaixo caso alguém queira ajudar.. O problema seria na Senha, pós o jogador mesmo colocando a certa dar como errada, já mudei muitas coisas achando que iria resolver mas persisto no erro!


https://pastebin.com/9iTBaHpf



Caso tenha alguém com mais exp que eu, peço ajuda a achar essa mísera que eu to batendo cabeça!


RE: Login Textdraw - White_Blue - 18/11/2025

Repare na sequência de eventos:
  1. O jogador clica para logar;
  2. O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
  3. Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
  4. Somente se a comparação for bem-sucedida, você chama CarregarDados(playerid).
O problema é que PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios nesse momento, porque a função CarregarDados (que preenche esses valores) ainda não foi chamada. Você está comparando a senha digitada com nada.


Você precisa ler o salt e a senha já hasheada do arquivo do jogador antes de fazer a comparação. Apenas depois que a senha for validada, você pode chamar CarregarDados para carregar o resto das informações.

Código PHP:
        else // linha 609
        
{
            new 
senhaformatada[MAX_PASSWORD_LEN];
            
// PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios
            
SHA256_PassHash(SenhaInformada[playerid], PlayerInfo[playerid][Salt], senhaformatadaMAX_PASSWORD_LEN);
            if(!
strcmp(senhaformatadaPlayerInfo[playerid][pSenha], falseMAX_PASSWORD_LEN)) 
            {
                
CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação.
            
}
            else 
            { 
                
Erro[playerid] ++;
                if(
Erro[playerid] == 3Kick(playerid), ErrorMsg(playerid"Voce foi kickado por errar a senha muitas vezes.");
                
Dialog_Show(playeridLoginServidorDIALOG_STYLE_PASSWORD"Efetuando login no servidor""Digite sua senha para logar. \n*Sua senha estava incorreta""Confirmar""Cancelar");
            }
        } 



RE: Login Textdraw - RosaScripter - 19/11/2025

(18/11/2025 23:39)White_Blue Escreveu: Repare na sequência de eventos:
  1. O jogador clica para logar;
  2. O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
  3. Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
  4. Somente se a comparação for bem-sucedida, você chama CarregarDados(playerid).
O problema é que PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios nesse momento, porque a função CarregarDados (que preenche esses valores) ainda não foi chamada. Você está comparando a senha digitada com nada.


Você precisa ler o salt e a senha já hasheada do arquivo do jogador antes de fazer a comparação. Apenas depois que a senha for validada, você pode chamar CarregarDados para carregar o resto das informações.

Código PHP:
        else // linha 609
        
{
            new 
senhaformatada[MAX_PASSWORD_LEN];
            
// PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios
            
SHA256_PassHash(SenhaInformada[playerid], PlayerInfo[playerid][Salt], senhaformatadaMAX_PASSWORD_LEN);
            if(!
strcmp(senhaformatadaPlayerInfo[playerid][pSenha], falseMAX_PASSWORD_LEN)) 
            {
                
CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação.
            
}
            else 
            { 
                
Erro[playerid] ++;
                if(
Erro[playerid] == 3Kick(playerid), ErrorMsg(playerid"Voce foi kickado por errar a senha muitas vezes.");
                
Dialog_Show(playeridLoginServidorDIALOG_STYLE_PASSWORD"Efetuando login no servidor""Digite sua senha para logar. \n*Sua senha estava incorreta""Confirmar""Cancelar");
            }
        } 

Pode está me mostrando como resolveria? Para eu ter uma noção no que eu deixei passar.. nesse momento estou testando oque me informou.


RE: Login Textdraw - White_Blue - 19/11/2025

(19/11/2025 00:20)RosaScripter Escreveu:
(18/11/2025 23:39)White_Blue Escreveu: Repare na sequência de eventos:
  1. O jogador clica para logar;
  2. O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
  3. Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
  4. Somente se a comparação for bem-sucedida, você chama CarregarDados(playerid).
O problema é que PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios nesse momento, porque a função CarregarDados (que preenche esses valores) ainda não foi chamada. Você está comparando a senha digitada com nada.


Você precisa ler o salt e a senha já hasheada do arquivo do jogador antes de fazer a comparação. Apenas depois que a senha for validada, você pode chamar CarregarDados para carregar o resto das informações.

Código PHP:
        else // linha 609
        
{
            new 
senhaformatada[MAX_PASSWORD_LEN];
            
// PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios
            
SHA256_PassHash(SenhaInformada[playerid], PlayerInfo[playerid][Salt], senhaformatadaMAX_PASSWORD_LEN);
            if(!
strcmp(senhaformatadaPlayerInfo[playerid][pSenha], falseMAX_PASSWORD_LEN)) 
            {
                
CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação.
            
}
            else 
            { 
                
Erro[playerid] ++;
                if(
Erro[playerid] == 3Kick(playerid), ErrorMsg(playerid"Voce foi kickado por errar a senha muitas vezes.");
                
Dialog_Show(playeridLoginServidorDIALOG_STYLE_PASSWORD"Efetuando login no servidor""Digite sua senha para logar. \n*Sua senha estava incorreta""Confirmar""Cancelar");
            }
        } 

Pode está me mostrando como resolveria? Para eu ter uma noção no que eu deixei passar.. nesse momento estou testando oque me informou.

É bem simples.

Basta carregar o hash e o salt da conta, armazenar os valores em variáveis, gerar o hash da senha informada e comparar os dois.

Código PHP:
else {            
            new 
File[256];
            
format(Filesizeof(File), PASTA_USUARIOSName(playerid));

            
// carregamos o salt e o hash
            
new stored_salt[SALT_LEN];
            new 
stored_hash[MAX_PASSWORD_LEN];
            
format(stored_saltsizeof(stored_salt), DOF2_GetString(File"pSalt"));
            
format(stored_hashsizeof(stored_hash), DOF2_GetString(File"pSenha"));

            
// criamos o hash da senha que o jogador informou, usando o salt que acabamos de carregar
            
new senhaformatada[MAX_PASSWORD_LEN];
            
SHA256_PassHash(SenhaInformada[playerid], stored_saltsenhaformatadaMAX_PASSWORD_LEN);

            
// comparamos o hash recém criado com o hash que estava salvo no arquivo
            
if(!strcmp(senhaformatadastored_hash))
            {
                
// agora sim, carregamos todos os dados do jogador se a senha estiver correta
                
CarregarDados(playerid);
            } 



RE: Login Textdraw - RosaScripter - 19/11/2025

(19/11/2025 01:09)White_Blue Escreveu:
(19/11/2025 00:20)RosaScripter Escreveu:
(18/11/2025 23:39)White_Blue Escreveu: Repare na sequência de eventos:
  1. O jogador clica para logar;
  2. O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
  3. Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
  4. Somente se a comparação for bem-sucedida, você chama CarregarDados(playerid).
O problema é que PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios nesse momento, porque a função CarregarDados (que preenche esses valores) ainda não foi chamada. Você está comparando a senha digitada com nada.


Você precisa ler o salt e a senha já hasheada do arquivo do jogador antes de fazer a comparação. Apenas depois que a senha for validada, você pode chamar CarregarDados para carregar o resto das informações.

Código PHP:
        else // linha 609
        
{
            new 
senhaformatada[MAX_PASSWORD_LEN];
            
// PlayerInfo[playerid][Salt] e PlayerInfo[playerid][pSenha] estão vazios
            
SHA256_PassHash(SenhaInformada[playerid], PlayerInfo[playerid][Salt], senhaformatadaMAX_PASSWORD_LEN);
            if(!
strcmp(senhaformatadaPlayerInfo[playerid][pSenha], falseMAX_PASSWORD_LEN)) 
            {
                
CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação.
            
}
            else 
            { 
                
Erro[playerid] ++;
                if(
Erro[playerid] == 3Kick(playerid), ErrorMsg(playerid"Voce foi kickado por errar a senha muitas vezes.");
                
Dialog_Show(playeridLoginServidorDIALOG_STYLE_PASSWORD"Efetuando login no servidor""Digite sua senha para logar. \n*Sua senha estava incorreta""Confirmar""Cancelar");
            }
        } 

Pode está me mostrando como resolveria? Para eu ter uma noção no que eu deixei passar.. nesse momento estou testando oque me informou.

É bem simples.

Basta carregar o hash e o salt da conta, armazenar os valores em variáveis, gerar o hash da senha informada e comparar os dois.

Código PHP:
else {            
            new 
File[256];
            
format(Filesizeof(File), PASTA_USUARIOSName(playerid));

            
// carregamos o salt e o hash
            
new stored_salt[SALT_LEN];
            new 
stored_hash[MAX_PASSWORD_LEN];
            
format(stored_saltsizeof(stored_salt), DOF2_GetString(File"pSalt"));
            
format(stored_hashsizeof(stored_hash), DOF2_GetString(File"pSenha"));

            
// criamos o hash da senha que o jogador informou, usando o salt que acabamos de carregar
            
new senhaformatada[MAX_PASSWORD_LEN];
            
SHA256_PassHash(SenhaInformada[playerid], stored_saltsenhaformatadaMAX_PASSWORD_LEN);

            
// comparamos o hash recém criado com o hash que estava salvo no arquivo
            
if(!strcmp(senhaformatadastored_hash))
            {
                
// agora sim, carregamos todos os dados do jogador se a senha estiver correta
                
CarregarDados(playerid);
            } 

Fiz uma mudanças e usei o seu código de exemplo más o jogador entrar com quaisquer senha.
Posso está e enviando o gamemode para dar uma olhada?