MySQL R39-3 Problem bei der Passwortüberprüfung.

In 10 Minuten startet der nächtliche Backupvorgang! Es kann währenddessen (ca. 10 Minuten) zu Einschränkungen bei der Nutzung des Forums kommen
Weitere Infos findet ihr im Thema Backup des Forums
Wichtiger Hinweis: Bitte ändert nicht manuell die Schriftfarbe auf schwarz sondern belasst es bei der Standardeinstellung. Somit tragt ihr dazu bei dass euer Text auch bei Verwendung unseren dunklen Forenstils noch lesbar ist!

Tipp: Ihr wollt längere Codeausschnitte oder Logfiles bereitstellen? Benutzt unseren eigenen PasteBin-Dienst Link
  • Hallo,


    ich bin gerade dabei auf MySQL R39-3 umzusatteln, allerdings habe ich da einige Probleme.


    Es fängt bei der Abfrage beim Login, ob das Passwort richtig ist an. Ich kann das richtige Passwort
    eingeben und bin eingeloggt, aber auch das falsche Passwort und bin dann ebenfalls eingeloggt.


    Hier mal der Auszug, wo und wie die Abfrage stattfindet:

    case DIALOG_LOGIN:
    {
    if(response)
    {
    if(strlen(inputtext) == 0) // Wenn kein Passwort angegebene wurde
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Anmeldung","Das Angegebene Passwort war Falsch!","Anmelden","Abbrechen");
    return 1;
    }
    else
    {
    new query[256];
    mysql_format(handle, query, sizeof(query), "SELECT id FROM accounts WHERE Name = '%e' AND Passwort = MD5('%e')", SpielerInfo[playerid][pName], inputtext);
    if(cache_get_row_count() == 0)
    {
    SpielerInfo[playerid][pdb_id] = cache_get_field_content_int(0, "id", handle);
    SpielerInfo[playerid][pLevel] = cache_get_field_content_int(0, "Level", handle);
    SpielerInfo[playerid][pSkin] = cache_get_field_content_int(0, "Skin", handle);
    SpielerInfo[playerid][pGeld] = cache_get_field_content_int(0, "Geld", handle);
    SpielerInfo[playerid][pKills] = cache_get_field_content_int(0, "Kills", handle);
    SpielerInfo[playerid][pTode] = cache_get_field_content_int(0, "Tode", handle);
    SpielerInfo[playerid][pbdaytag] = cache_get_field_content_int(0, "bdaytag", handle);
    SpielerInfo[playerid][pbdaymonat] = cache_get_field_content_int(0, "bdaymonat", handle);
    SpielerInfo[playerid][pbdayjahr] = cache_get_field_content_int(0, "bdayjahr", handle);
    SpielerInfo[playerid][pSex] = cache_get_field_content_int(0, "Sex", handle);
    SpielerInfo[playerid][pSkins] = cache_get_query_string("Skins", handle);
    SpielerInfo[playerid][pSecAntwort] = cache_get_query_string("SecAntwort", handle);
    SpielerInfo[playerid][pSecFrage] = cache_get_field_content_int(0, "SecFrage", handle);
    SpielerInfo[playerid][pLoggedIn] = true;
    if(SpielerInfo[playerid][pSecFrage] != 0)
    {

  • Du solltest den Cache über ein Callback auslesen und das Query zuvor auch absenden.


    case DIALOG_LOGIN:
    {
    if(response)
    {
    if(strlen(inputtext) == 0) // Wenn kein Passwort angegebene wurde
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Anmeldung","Das Angegebene Passwort war Falsch!","Anmelden","Abbrechen");
    return 1;
    }
    else
    {
    new query[256];
    mysql_format(handle, query, sizeof(query), "SELECT * FROM accounts WHERE Name = '%e' AND Passwort = MD5('%e')", SpielerInfo[playerid][pName], inputtext);
    mysql_pquery(handle, query, "OnUserLogin", "d", playerid);
    }
    }
    }


    forward OnUserLogin(playerid);
    public OnUserLogin(playerid)
    {
    if(cache_get_row_count() != 0)
    {
    SpielerInfo[playerid][pdb_id] = cache_get_field_content_int(0, "id", handle);
    SpielerInfo[playerid][pLevel] = cache_get_field_content_int(0, "Level", handle);
    SpielerInfo[playerid][pSkin] = cache_get_field_content_int(0, "Skin", handle);
    SpielerInfo[playerid][pGeld] = cache_get_field_content_int(0, "Geld", handle);
    SpielerInfo[playerid][pKills] = cache_get_field_content_int(0, "Kills", handle);
    SpielerInfo[playerid][pTode] = cache_get_field_content_int(0, "Tode", handle);
    SpielerInfo[playerid][pbdaytag] = cache_get_field_content_int(0, "bdaytag", handle);
    SpielerInfo[playerid][pbdaymonat] = cache_get_field_content_int(0, "bdaymonat", handle);
    SpielerInfo[playerid][pbdayjahr] = cache_get_field_content_int(0, "bdayjahr", handle);
    SpielerInfo[playerid][pSex] = cache_get_field_content_int(0, "Sex", handle);
    SpielerInfo[playerid][pSkins] = cache_get_query_string("Skins", handle);
    SpielerInfo[playerid][pSecAntwort] = cache_get_query_string("SecAntwort", handle);
    SpielerInfo[playerid][pSecFrage] = cache_get_field_content_int(0, "SecFrage", handle);
    SpielerInfo[playerid][pLoggedIn] = true;
    if(SpielerInfo[playerid][pSecFrage] != 0)
    {
    //...
    }
    }
    return 1;
    }


    PS: Du hast das schon wieder in der MTA Scripting Base gepostet.


    Du kannst - als Hilfestellung - auch mein Tutorial nutzen: [ SCRIPTING ] [jTuT] MySQL R39-3 (Installation, XAMPP, Verwendung, Bedienung & Registrations-System)

    3HZXdYd.png

    Einmal editiert, zuletzt von Jeffry ()

  • kleiner Tipp am rande.

    PHP
    mysql_format(handle, query, sizeof(query), "SELECT id FROM accounts WHERE Name = '%e' AND Passwort = MD5('%e')", SpielerInfo[playerid][pName], inputtext);


    würde "SELECT id FROM accounts WHERE Name = '%e' AND Passwort = MD5('ich bin ein Passwort')" rauskommen.


    PHP
    mysql_format(handle, query, sizeof(query), "SELECT id FROM accounts WHERE Name = '%e' AND Passwort = '%e'", SpielerInfo[playerid][pName], MD5(inputtext));

    Mit Freundlichen Grüßen
    Whitetiiger aka. Kaito-sensei
    P.s. Alle mit #IRONIE bestätigten Sätze von mir, sind als Ironie anzusehen.

  • whitetiiger: Das stimmt schon so. Die MD5-Funktion kann in Queries verwendet werden, sonst bräuchte man ein extra Plugin dafür.
    Allerdings muss das Query so aussehen ist mir noch aufgefallen:
    mysql_format(handle, query, sizeof(query), "SELECT * FROM accounts WHERE Name = '%e' AND Passwort = MD5('%e')", SpielerInfo[playerid][pName], inputtext);


    Sonst liest er nur die id aus.
    Habe es oben geändert.

  • Man sollte vielleicht hinten ein "(MTA SA)" und "(SAMP)" dranhängen, in der eile verwechselt man das schon einmal.. :S



    Ich habe mir natürlich dein Tut angeschaut, allerdings muss ich so wie Du es machst
    bei meinen Script viele publics schreiben. Daher wollte ich es eigentlich so lösen.

    Einmal editiert, zuletzt von Syneroz ()

  • Du kannst es natürlich ohne die Publics lösen, aber das wird dir niemand empfehlen.
    Der Code sieht dann so aus:

    Spoiler anzeigen
    case DIALOG_LOGIN:
    {
    if(response)
    {
    if(strlen(inputtext) == 0) // Wenn kein Passwort angegebene wurde
    {
    ShowPlayerDialog(playerid,DIALOG_LOGIN,DIALOG_STYLE_PASSWORD,"Anmeldung","Das Angegebene Passwort war Falsch!","Anmelden","Abbrechen");
    return 1;
    }
    else
    {
    new query[256];
    mysql_format(handle, query, sizeof(query), "SELECT * FROM accounts WHERE Name = '%e' AND Passwort = MD5('%e')", SpielerInfo[playerid][pName], inputtext);
    mysql_query(handle, query);
    if(cache_get_row_count() != 0)
    {
    SpielerInfo[playerid][pdb_id] = cache_get_field_content_int(0, "id", handle);
    SpielerInfo[playerid][pLevel] = cache_get_field_content_int(0, "Level", handle);
    SpielerInfo[playerid][pSkin] = cache_get_field_content_int(0, "Skin", handle);
    SpielerInfo[playerid][pGeld] = cache_get_field_content_int(0, "Geld", handle);
    SpielerInfo[playerid][pKills] = cache_get_field_content_int(0, "Kills", handle);
    SpielerInfo[playerid][pTode] = cache_get_field_content_int(0, "Tode", handle);
    SpielerInfo[playerid][pbdaytag] = cache_get_field_content_int(0, "bdaytag", handle);
    SpielerInfo[playerid][pbdaymonat] = cache_get_field_content_int(0, "bdaymonat", handle);
    SpielerInfo[playerid][pbdayjahr] = cache_get_field_content_int(0, "bdayjahr", handle);
    SpielerInfo[playerid][pSex] = cache_get_field_content_int(0, "Sex", handle);
    SpielerInfo[playerid][pSkins] = cache_get_query_string("Skins", handle);
    SpielerInfo[playerid][pSecAntwort] = cache_get_query_string("SecAntwort", handle);
    SpielerInfo[playerid][pSecFrage] = cache_get_field_content_int(0, "SecFrage", handle);
    SpielerInfo[playerid][pLoggedIn] = true;
    if(SpielerInfo[playerid][pSecFrage] != 0)
    {
    //...
    }
    }
    }
    }
    }

    Aber das nimmt dir natürlich den Performancevorteil den du durch das neue Plugin hast, da der Server erst auf die Antwort des MySQL Servers wartet.

  • So ich habe das ganze jetzt auf die Publics umgeschrieben. - Von ca. 4000 Zeilen im Login/Register-System sind nur noch ca. 3300 übrig.. :D


    Und da ist gleich das nächste Problem:



    new query[256]; mysql_format(handle, query, sizeof(query), "UPDATE accounts SET SecAntwort = '%s' WHERE id = '%i'",inputtext, SpielerInfo[playerid][pdb_id]);
    mysql_pquery(handle, query);


    Nun würde ich gerne anstelle dessen das ganze so speichern, dass der inputtext so abgespeichert wird:



    SpielerInfo[playerid][pSecAntwort] = ??



    Des weiteren wird nichts gespeichert:
    stock SavePlayer(playerid)
    {
    if(SpielerInfo[playerid][pLoggedIn])
    {
    new query[256];
    if(!strlen(SpielerInfo[playerid][pSkins]))
    {
    for(new i=0; i<39; i++) format(SpielerInfo[playerid][pSkins], 313, "%s00000000", SpielerInfo[playerid][pSkins]);
    }
    mysql_format(handle, query, sizeof(query), "UPDATE accounts SET Level = '%i', Skin = '%i', Geld = '%i', Kills = '%i', Tode = '%i', bdaytag = '%i', bdaymonat = '%i', bdayjahr = '%i', Sex = '%i', SecFrage = '%i',Fraktion = '%i', Skins = '%s' WHERE id = '%s'",
    SpielerInfo[playerid][pLevel], SpielerInfo[playerid][pSkin],SpielerInfo[playerid][pGeld], SpielerInfo[playerid][pKills], SpielerInfo[playerid][pTode], SpielerInfo[playerid][pbdaytag], SpielerInfo[playerid][pbdaymonat], SpielerInfo[playerid][pbdayjahr], SpielerInfo[playerid][pSex], SpielerInfo[playerid][pSecFrage], SpielerInfo[playerid][pFraktion], SpielerInfo[playerid][pSkins], SpielerInfo[playerid][pdb_id]);
    mysql_pquery(handle, query);
    }
    return 1;
    }

    Einmal editiert, zuletzt von Syneroz ()

  • Soweit so gut.. :D


    Nun habe ich noch das Problem, dass ich bei 3 Skins habe, die jeder Spieler nach der Registrierung im Besitz haben soll:



    SpielerInfo[playerid][pSkins][303] = '1';
    SpielerInfo[playerid][pSkins][304] = '1';
    SpielerInfo[playerid][pSkins][305] = '1';


    Egal wie ich es drehe und wende, die 3 Skins bleiben in der Datenbank auf 0.


    Hiermit wird der Account erstellt:
    new query[768];
    for(new i=0; i<39; i++) format(SpielerInfo[playerid][pSkins], 313, "%s00000000", SpielerInfo[playerid][pSkins]);
    mysql_format(handle, query, sizeof(query), "INSERT INTO accounts (Name, Passwort, Skins) VALUES ('%e', MD5('%e'), '%e')", SpielerInfo[playerid][pName], inputtext, SpielerInfo[playerid][pSkins]);
    mysql_pquery(handle, query, "CreateAccount", "d", playerid);


    Das dazugehörige Piblic:


    forward CreateAccount(playerid);
    public CreateAccount(playerid)
    {
    SpielerInfo[playerid][pdb_id] = cache_insert_id();
    return 1;
    }

  • new query[768];
    for(new i=0; i<39; i++) format(SpielerInfo[playerid][pSkins], 313, "%s00000000", SpielerInfo[playerid][pSkins]);
    SpielerInfo[playerid][pSkins][303] = '1';
    SpielerInfo[playerid][pSkins][304] = '1';
    SpielerInfo[playerid][pSkins][305] = '1';
    mysql_format(handle, query, sizeof(query), "INSERT INTO accounts (Name, Passwort, Skins) VALUES ('%e', MD5('%e'), '%e')", SpielerInfo[playerid][pName], inputtext, SpielerInfo[playerid][pSkins]);
    mysql_pquery(handle, query, "CreateAccount", "d", playerid);

  • do.de - Domain-Offensive - Domains für alle und zu super Preisen