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

Titre: Système de comptes par MySQL
Posté 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:
Titre: Re : Système de comptes par MySQL
Posté par: chneubeul le 20 Mai 2013, 19:41:25
Salut :)

Et si tu nous envoyez ta fonction qui vérifie le mot de passe ? :p
Titre: Re : Système de comptes par MySQL
Posté par: Infu le 20 Mai 2013, 19:49:19
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.
Code: (pawn) [Sélectionner]
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...
Code: (pawn) [Sélectionner]
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;
}
Titre: Re : Système de comptes par MySQL
Posté par: chneubeul le 20 Mai 2013, 20:41:52
Je ne vois nul part ou tu vérifie si les mots de passes sont les mêmes :p
Titre: Re : Système de comptes par MySQL
Posté par: Gzsume le 20 Mai 2013, 20:50:13
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 ?
Titre: Re : Système de comptes par MySQL
Posté par: Infu le 20 Mai 2013, 20:53:08
Code: (pawn) [Sélectionner]
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;
}

Titre: Re : Système de comptes par MySQL
Posté par: chneubeul le 20 Mai 2013, 21:51:03
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.
Titre: Re : Système de comptes par MySQL
Posté par: S!m le 21 Mai 2013, 15:08:55
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++
Titre: Re : Système de comptes par MySQL
Posté par: chneubeul le 21 Mai 2013, 17:22:02
Salut,

Ah oui, je n'y avait pas fait attention. :)

Envoie nous le code ou tu appelle "LoginPlayer" stp
Titre: Re : Système de comptes par MySQL
Posté par: Infu le 21 Mai 2013, 19:59:43
Voilà voilà

Code: (pawn) [Sélectionner]
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;
}
Titre: Re : Système de comptes par MySQL
Posté par: chneubeul le 21 Mai 2013, 22:05:32
non la ou tu l'appelles :p
Titre: Re : Système de comptes par MySQL
Posté par: Infu le 22 Mai 2013, 17:54:23
Ah oui excuse moi la seule fois où elle est appelée c'est dans /login

Code: (pawn) [Sélectionner]
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;
}
Titre: Re : Système de comptes par MySQL
Posté par: chneubeul le 22 Mai 2013, 21:52:46
Salut :)

Je ferais quelques test avec ta requête SQL demain voir ce que ça retourne :)

A+, Sam.
:medieval_sword2:
Titre: Re : Système de comptes par MySQL
Posté par: Infu le 22 Mai 2013, 22:20:49
Je te remercie  :smile:
Titre: Re : Système de comptes par MySQL
Posté par: chneubeul le 23 Mai 2013, 18:54:12
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:
Titre: Re : Système de comptes par MySQL
Posté par: Infu le 23 Mai 2013, 19:34:07
Ouais mais pourtant je suis pas le seul avec qui ça ne fonctionne pas (cf. sa-mp.com )
Titre: Re : Système de comptes par MySQL
Posté par: Xartrick le 29 Mai 2013, 06:47:44
Fait attention aux injections SQL !
Titre: Re : Système de comptes par MySQL
Posté par: Infu le 29 Mai 2013, 13:49:32
J'y connais rien du tout, je ne fais que suivre ce qu'on me dit ^^
Titre: Re : Système de comptes par MySQL
Posté par: Xartrick le 29 Mai 2013, 22:20:32
Documente toi alors, ça te sauvera de bien des problèmes.
Titre: Re : Système de comptes par MySQL
Posté par: Ssk le 29 Mai 2013, 22:32:01
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.
Titre: Re : Système de comptes par MySQL
Posté par: Xolokos le 15 Juin 2013, 10:42:23
Ils ont pas mit un
Code: (PHP) [Sélectionner]
mysql_real_escape_string(string[], string2[]); pour éviter les failles type SQL ?
Titre: Re : Système de comptes par MySQL
Posté par: Infu le 15 Juin 2013, 10:59:54
Dans le tuto non