GTAOnline.net
San Andreas Multiplayer (sa:mp) => Scripting SA-MP [Pawn center] => Discussion démarrée par: Infu le 20 Mai 2013, 15:10:26
-
Bonjour,
Ca fait maintenant 3 jours que je suis plusieurs tutos afin de créer un système de création de compte par mySQL.
Dans chacun des tutos (en anglais) que j'ai suivi à la lettre, il y a des problèmes.
Celui-ci (http://forum.sa-mp.com/showthread.php?t=160971) par exemple, quand je me connecte avec un pseudo que je n'ai jamais utilisé, dit que le compte existe. Ou alors, quand je fais /login avec un compte créé, et que je tape n'importe quel MDP ça marche.
Je cherche désespérément un bon tutoriel qu'il soit anglais ou français, mais fonctionnel ! Je ne cherche pas de Filterscript tout prêt, ça sert à rien car on apprend pas. Je me tourne vers vous, pour savoir si vous connaissiez un tutoriel, ou si vous vous sentez capable de m'expliquer par Teamviewer, forum comme vous voulez...
Je vous remercie d'avance :smile:
-
Salut :)
Et si tu nous envoyez ta fonction qui vérifie le mot de passe ? :p
-
Tout est dans le tuto :tongue:
EDIT: Je le met quand même, c'est pas à vous de chercher ;)
Vérifier si un compte existe.
CheckAccountExists(account[])
{
new string[128];
format(string, sizeof(string), "SELECT * FROM Users WHERE Name = '%s'", account);
mysql_query(string);
mysql_store_result();
new value;
value = mysql_num_rows();
mysql_free_result();
return value;
}
Se connecter/enregistrer...
RegisterPlayer(playerid, password[])
{
if(AccountExists[playerid])
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] You're already registered!");
if(PlayerLogged[playerid])
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] You're already logged in!");
if(strlen(password) < 3 || strlen(password) >= 32)
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Your password is too short or too long!");
CheckMySQL();
new string[128];
format(string, sizeof(string), "INSERT INTO Users (Name,Password) VALUES ('%s','%s')", UserStats[playerid][Name], password);
mysql_query(string);
AccountExists[playerid] = 1;
SendClientMessage(playerid, COLOR_YELLOW, "[ACCOUNT] Your account has been created, please login now!");
LoginPlayer(playerid, password);
return 1;
}
LoginPlayer(playerid, password[])
{
if(!AccountExists[playerid])
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] You're not registered!");
if(PlayerLogged[playerid])
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] You're already logged in!");
if(strlen(password) < 3 || strlen(password) >= 32)
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Your password is too short or too long!");
CheckMySQL();
new string[128];
format(string, sizeof(string), "SELECT * FROM Users WHERE Name = '%s' AND Password = '%s'", UserStats[playerid][Name], password);
mysql_query(string);
mysql_store_result();
if(!mysql_num_rows())
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Incorrect password!");
new row[128]; // The length of 1 'row' total.
new field[4][32]; // [4] = Amount of fields, [24] = Max length of the bigest field.
mysql_fetch_row_format(row, "|");
explode(row, field, "|");
mysql_free_result();
// The field starts here with 1, because the field 'Name' = 0, and we already have the name in a variable.
format(UserStats[playerid][Password], 32, "%s", field[1]);
UserStats[playerid][Admin] = strval(field[2]);
UserStats[playerid][Money] = strval(field[3]);
GivePlayerMoney(playerid, UserStats[playerid][Money]);
format(string, sizeof(string), "[ACCOUNT] Welcome back %s, you are now logged in!", UserStats[playerid][Name]);
SendClientMessage(playerid, COLOR_YELLOW, string);
PlayerLogged[playerid] = 1;
return 1;
}
SavePlayer(playerid)
{
if(!PlayerLogged[playerid])
return 0;
UserStats[playerid][Money] = GetPlayerMoney(playerid);
CheckMySQL();
new string[256];
format(string, sizeof(string), "UPDATE Users SET Password='%s',Admin='%d',Money='%d' WHERE Name='%s'", UserStats[playerid][Password], UserStats[playerid][Admin], UserStats[playerid][Money], UserStats[playerid][Name]);
mysql_query(string);
return 1;
}
-
Je ne vois nul part ou tu vérifie si les mots de passes sont les mêmes :p
-
Je ne vois même pas où la fonction CheckAccountExists(account[]) est utilisée... Visiblement tu as un tableau dans lequel les booléens de cette fonction sont enregistrés, pourrais-tu nous le montrer ?
-
public OnPlayerConnect(playerid)
{
GetPlayerName(playerid, UserStats[playerid][Name], MAX_PLAYER_NAME);
if(CheckAccountExists(UserStats[playerid][Name])) AccountExists[playerid] = 1;
else AccountExists[playerid] = 0;
return 1;
}
-
Ce que je voulais dire c'est que tu vérifie juste si tu as récupérer des données via ta requête grâce à :
if(!mysql_num_rows())
mais en aucun cas tu vérifie la similitude des 2 chaines de caractères.
-
Salut,
chneubeul, vérifie la requête dans le LoginPlayer:
format(string, sizeof(string), "SELECT * FROM Users WHERE Name = '%s' AND Password = '%s'", UserStats[playerid][Name], password);
elle est là la vérification du mot de passe.
++Sim++
-
Salut,
Ah oui, je n'y avait pas fait attention. :)
Envoie nous le code ou tu appelle "LoginPlayer" stp
-
Voilà voilà
LoginPlayer(playerid, password[])
{
if(!AccountExists[playerid])
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] You're not registered!");
if(PlayerLogged[playerid])
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] You're already logged in!");
if(strlen(password) < 3 || strlen(password) >= 32)
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Your password is too short or too long!");
CheckMySQL();
new string[128];
format(string, sizeof(string), "SELECT * FROM Users WHERE Name = '%s' AND Password = '%s'", UserStats[playerid][Name], password);
mysql_query(string);
mysql_store_result();
if(!mysql_num_rows())
return SendClientMessage(playerid, COLOR_RED, "[ACCOUNT] Incorrect password!");
new row[128]; // The length of 1 'row' total.
new field[4][32]; // [4] = Amount of fields, [24] = Max length of the bigest field.
mysql_fetch_row_format(row, "|");
explode(row, field, "|");
mysql_free_result();
// The field starts here with 1, because the field 'Name' = 0, and we already have the name in a variable.
format(UserStats[playerid][Password], 32, "%s", field[1]);
UserStats[playerid][Admin] = strval(field[2]);
UserStats[playerid][Money] = strval(field[3]);
GivePlayerMoney(playerid, UserStats[playerid][Money]);
format(string, sizeof(string), "[ACCOUNT] Welcome back %s, you are now logged in!", UserStats[playerid][Name]);
SendClientMessage(playerid, COLOR_YELLOW, string);
PlayerLogged[playerid] = 1;
return 1;
}
-
non la ou tu l'appelles :p
-
Ah oui excuse moi la seule fois où elle est appelée c'est dans /login
public OnPlayerCommandText(playerid, cmdtext[])
{
dcmd(register, 8, cmdtext);
dcmd(login, 5, cmdtext);
return 0;
}
dcmd_register(playerid, params[])
{
RegisterPlayer(playerid, params);
return 1;
}
dcmd_login(playerid, params[])
{
LoginPlayer(playerid, params);
return 1;
}
-
Salut :)
Je ferais quelques test avec ta requête SQL demain voir ce que ça retourne :)
A+, Sam.
:medieval_sword2:
-
Je te remercie :smile:
-
Salut :)
J'ai tester et comparer par rapport à mon script, enfaite si tu SELECT * tu récupère des choses quand même.
Du coup, je comprend pas pourquoi, j'vais faire plus de test pour mieux comprendre, mais en selectionant par exemple SELECT id, le script fonctionne :)
Voilà tout,
A+, Sam.
:medieval_sword2:
-
Ouais mais pourtant je suis pas le seul avec qui ça ne fonctionne pas (cf. sa-mp.com )
-
Fait attention aux injections SQL !
-
J'y connais rien du tout, je ne fais que suivre ce qu'on me dit ^^
-
Documente toi alors, ça te sauvera de bien des problèmes.
-
Par exemple si le je mets ' or 'a'='a comme mot de passe, ça me loggera, après je pourrai par exemple chopper les infos d'un joueur, du genre.
Si je mets, ' or id='1, je serai connecté avec le compte ayant l'id 1 (souvent l'admin) et je serai admin.
-
Ils ont pas mit un
mysql_real_escape_string(string[], string2[]);
pour éviter les failles type SQL ?
-
Dans le tuto non