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:
- O jogador clica para logar;
- O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
- Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
- 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], senhaformatada, MAX_PASSWORD_LEN); if(!strcmp(senhaformatada, PlayerInfo[playerid][pSenha], false, MAX_PASSWORD_LEN)) { CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação. } else { Erro[playerid] ++; if(Erro[playerid] == 3) Kick(playerid), ErrorMsg(playerid, "Voce foi kickado por errar a senha muitas vezes."); Dialog_Show(playerid, LoginServidor, DIALOG_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:
- O jogador clica para logar;
- O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
- Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
- 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], senhaformatada, MAX_PASSWORD_LEN); if(!strcmp(senhaformatada, PlayerInfo[playerid][pSenha], false, MAX_PASSWORD_LEN)) { CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação. } else { Erro[playerid] ++; if(Erro[playerid] == 3) Kick(playerid), ErrorMsg(playerid, "Voce foi kickado por errar a senha muitas vezes."); Dialog_Show(playerid, LoginServidor, DIALOG_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:
- O jogador clica para logar;
- O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
- Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
- 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], senhaformatada, MAX_PASSWORD_LEN); if(!strcmp(senhaformatada, PlayerInfo[playerid][pSenha], false, MAX_PASSWORD_LEN)) { CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação. } else { Erro[playerid] ++; if(Erro[playerid] == 3) Kick(playerid), ErrorMsg(playerid, "Voce foi kickado por errar a senha muitas vezes."); Dialog_Show(playerid, LoginServidor, DIALOG_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(File, sizeof(File), PASTA_USUARIOS, Name(playerid));
// carregamos o salt e o hash new stored_salt[SALT_LEN]; new stored_hash[MAX_PASSWORD_LEN]; format(stored_salt, sizeof(stored_salt), DOF2_GetString(File, "pSalt")); format(stored_hash, sizeof(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_salt, senhaformatada, MAX_PASSWORD_LEN);
// comparamos o hash recém criado com o hash que estava salvo no arquivo if(!strcmp(senhaformatada, stored_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:
- O jogador clica para logar;
- O seu código executa a função `SHA256_PassHash` usando o valor armazenado em `PlayerInfo[playerid][Salt]` como salt;
- Depois, compara o resultado com `PlayerInfo[playerid][pSenha]`;
- 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], senhaformatada, MAX_PASSWORD_LEN); if(!strcmp(senhaformatada, PlayerInfo[playerid][pSenha], false, MAX_PASSWORD_LEN)) { CarregarDados(playerid); // Carrega os dados só depois do login, mas é tarde demais para a verificação. } else { Erro[playerid] ++; if(Erro[playerid] == 3) Kick(playerid), ErrorMsg(playerid, "Voce foi kickado por errar a senha muitas vezes."); Dialog_Show(playerid, LoginServidor, DIALOG_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(File, sizeof(File), PASTA_USUARIOS, Name(playerid));
// carregamos o salt e o hash new stored_salt[SALT_LEN]; new stored_hash[MAX_PASSWORD_LEN]; format(stored_salt, sizeof(stored_salt), DOF2_GetString(File, "pSalt")); format(stored_hash, sizeof(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_salt, senhaformatada, MAX_PASSWORD_LEN);
// comparamos o hash recém criado com o hash que estava salvo no arquivo if(!strcmp(senhaformatada, stored_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?
|