MySQL Accountsystem - Probleme

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
  • Hier ist die Log:


    Meinst du das mit Login Code?

    if(dialogid == DIALOG_LOGIN)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    new query[256];
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort=MD5('%e')", Spielername(playerid), inputtext);
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
    }

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • War doch schon da oben ^^ egal habs ja an manchen Stellen nochmal editiert:

    forward OnPasswordResponse(playerid);
    public OnPasswordResponse(playerid)
    {
    new num_fields, num_rows;
    cache_get_data(num_rows, num_fields);
    if(num_rows == 0)
    {
    //Passwort falsch..
    /* Kamerafahrt */
    InterpolateCameraPos(playerid, 410.214721, -1902.890136, 1.724467, 702.832702, -1904.377319, 3.244797, 100000);
    InterpolateCameraLookAt(playerid, 410.543914, -1897.903930, 1.554080, 699.028930, -1901.132202, 3.214741, 100000);
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung - Passwort falsch", "Dein Passwort ist nicht richtig\nsolltest du es vergessen haben\nmelde dich im Forum.", "Anmelden", "Abbrechen");
    SetSpawnInfo(playerid,0,0,0,0,0,0,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    }
    else
    {
    //Passwort richtig..
    SendClientMessage(playerid,gelb, "Erfolgreich eingeloggt.");
    pInfo[playerid][pEingeloggt] = 1;
    LoadAccount(playerid);
    SpawnPlayer(playerid);
    }
    return 1;
    }

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Hm, das passt alles. Das einzigste was mir da spontan auffällt, wäre dass mysql_format vielleicht nicht mit dem %e in MD5 klar kommt.
    Ändere mal:
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort=MD5('%e')", Spielername(playerid), inputtext);
    zu:
    format(query, sizeof(query), "SELECT * FROM user WHERE username='%s' AND passwort=MD5('%s')", Spielername(playerid), inputtext);


    Klappt es dann? (Das mit dem escapen ist für den Test erst mal egal, du injectest deine eigene Datenbank ja nicht, da ändern wir dann, falls es geht.)

  • Beitrag von Pride ()

    Dieser Beitrag wurde gelöscht, Informationen über den Löschvorgang sind nicht verfügbar.
  • Sorry für die späte Antwort, war beschäftigt meine Treiber auf Windows 10 zu aktualisieren.
    Bin grade dabei Microsoft Edge zu testen.


    Debugge den Code mit diesen Prints:
    if(dialogid == DIALOG_LOGIN)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    new query[256];
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort=MD5('%e')", Spielername(playerid), inputtext);
    printf("query: %s", query);
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
    }


    forward OnPasswordResponse(playerid);
    public OnPasswordResponse(playerid)
    {
    new num_fields, num_rows;
    cache_get_data(num_rows, num_fields);
    printf("rows: %d", num_rows);
    if(num_rows == 0)
    {
    printf("Passwort falsch");
    //Passwort falsch..
    /* Kamerafahrt */
    InterpolateCameraPos(playerid, 410.214721, -1902.890136, 1.724467, 702.832702, -1904.377319, 3.244797, 100000);
    InterpolateCameraLookAt(playerid, 410.543914, -1897.903930, 1.554080, 699.028930, -1901.132202, 3.214741, 100000);
    ShowPlayerDialog(playerid, DIALOG_LOGIN, DIALOG_STYLE_PASSWORD, "Anmeldung - Passwort falsch", "Dein Passwort ist nicht richtig\nsolltest du es vergessen haben\nmelde dich im Forum.", "Anmelden", "Abbrechen");
    SetSpawnInfo(playerid,0,0,0,0,0,0,0,0,0,0,0,0);
    SpawnPlayer(playerid);
    }
    else
    {
    printf("Login");
    //Passwort richtig..
    SendClientMessage(playerid,gelb, "Erfolgreich eingeloggt.");
    pInfo[playerid][pEingeloggt] = 1;
    LoadAccount(playerid);
    SpawnPlayer(playerid);
    }
    return 1;
    }


    Poste dann, was im Server Log steht.
    Poste außerdem einen Screenshot von der user-Tabelle aus der Datenbank, wo man die Daten sieht.


  • //EDIT

    Mal so ne Frage was ich wenn ich die rows einfach drehe oder geht das nicht?

    - heftig abhängig von Karli Kugelblitz Choco Drinks

    Einmal editiert, zuletzt von Pride ()

  • Was du mal versuchen kannst, da gab es auch schon mal Probleme: Entferne alle die MD5's, also alle MD5('%s') bzw MD5('%e') zu: '%s' bzw '%e'
    Geht es dann?

    Wenn ich alle MD5's entferne dann geht es wunderbar :)


    //EDIT:
    Wie kann ich das jetzt trz. hashen?

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Das ist schon interessant, dass es dann geht. Na gut, du kannst das MD5 mit einem Plugin wie diesem generieren lassen:
    http://forum.sa-mp.com/showthread.php?t=152682


    Dann kannst du es damit in die Datenbank schreiben, bzw. den Select ausführen lassen, musst halt vorher das Passwort umwandeln lassen, anstatt im Query.



    (!!Achtung!! Bei solidfiles: Nutze den "Direct download link" und nicht den grünen Download-Button, da bekommst du eine .exe!)

  • Ich habe selbst auch noch nie damit gearbeitet, aber laut der Doku müsste es so klappen:
    new query[256], md5[33];
    md5(inputtext, md5);
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort='%e'", Spielername(playerid), md5);
    printf("query: %s", query);
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);


    Gleiches Prinzip natürlich beim Registrieren, bzw...kannst es ja erst mal dort noch mit dem MD5 im Query lassen, vielleicht reicht das schon so.



  • Ich verstehe das Include/Plugin was auch immer garnicht, ich kann mich dran erinnern das damals auch MD5 verwendet hatte
    gibt es nicht ein Include was genau diese Funktion von MD5 übernimmt so eins hatte ich, glaube ich ^^

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Genau das hab ich auch schon drinnen aber es hasht einfach nicht das Passwort kommt ganz normal in die Datenbank.


    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == DIALOG_REGISTER)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    if(strlen(inputtext) < 4)return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Anmeldung", "Es wurde kein Account unter diesem namen gefunden!", "Anmelden", "Abbrechen");
    new query[256];
    mysql_format(Handle, query, sizeof(query), "INSERT INTO user (username, passwort) VALUES ('%e',MD5_Hash('%e')", Spielername(playerid), inputtext);
    mysql_tquery(Handle, query);
    SendClientMessage(playerid, gelb, "Dein Account wurde erstellt.");
    GivePlayerMoney(playerid, 50000);
    SetPlayerScore(playerid, 10);
    }
    if(dialogid == DIALOG_LOGIN)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    new query[256];
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort=MD5_Hash('%e')", Spielername(playerid), inputtext);
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
    }
    return 1;
    }

    - heftig abhängig von Karli Kugelblitz Choco Drinks

  • Das darfst du nicht ins query schreiben.
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort='%e'", Spielername(playerid), MD5_Hash(inputtext));


    So natürlich auch beim registrieren.

  • Ich glaube ich bin für dich die Abend Unterhaltung wie viele Fehler ich hier mache x'D
    Es wird jetzt gehasht aber es speichert nicht mehr das "Test" Geld und das "Test" Level ^^



    Noch dazu kann ich mich nicht mehr anmelden, Passwort falsch :D





    if(dialogid == DIALOG_LOGIN)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    new query[256];
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort=('%e')", Spielername(playerid), MD5_Hash(inputtext));
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
    }

    - heftig abhängig von Karli Kugelblitz Choco Drinks


  • /* Account Speichern und Laden */
    stock LoadAccount(playerid)
    {
    pInfo[playerid][pEingeloggt] = 1;
    SendClientMessage(playerid,gruen,"Account läd...");
    pInfo[playerid][pGeld] = cache_get_field_content_int(0, "Geld", Handle), GivePlayerMoney(playerid, pInfo[playerid][pGeld]);
    pInfo[playerid][pLevel] = cache_get_field_content_int(0, "Level", Handle), SetPlayerScore(playerid, pInfo[playerid][pLevel]);
    pInfo[playerid][pAdmin] = cache_get_field_content_int(0, "Adminlevel", Handle), SetPlayerScore(playerid, pInfo[playerid][pAdmin]);
    SendClientMessage(playerid,gruen,"Account fertig geladen.");
    return 1;
    }
    stock SpielerSpeichern(playerid)
    {
    if(!pInfo[playerid][pEingeloggt])return 1;
    new query[128];
    mysql_format(Handle, query, sizeof query, "UPDATE `user` SET `Geld`='%i',`Level`='%i',`Adminlevel`='%i' WHERE `username`='%e'",GetPlayerMoney(playerid),GetPlayerScore(playerid),pInfo[playerid][pAdmin],Spielername(playerid)),
    mysql_pquery(Handle, query, "", "");
    return 1;
    }


    Was genau meinst du da jetzt beim Speichern?



    public OnDialogResponse(playerid, dialogid, response, listitem, inputtext[])
    {
    if(dialogid == DIALOG_REGISTER)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    if(strlen(inputtext) < 4)return ShowPlayerDialog(playerid, DIALOG_REGISTER, DIALOG_STYLE_PASSWORD, "Anmeldung", "Es wurde kein Account unter diesem namen gefunden!", "Anmelden", "Abbrechen");
    new query[256];
    mysql_format(Handle, query, sizeof(query), "INSERT INTO user (username, passwort) VALUES ('%e','%e')", Spielername(playerid), MD5_Hash(inputtext));
    mysql_tquery(Handle, query);
    SendClientMessage(playerid, gelb, "Dein Account wurde erstellt.");
    GivePlayerMoney(playerid, 50000);
    SetPlayerScore(playerid, 10);
    }
    if(dialogid == DIALOG_LOGIN)
    {
    if(!response)
    {
    return Kick(playerid);
    }
    new query[256];
    mysql_format(Handle, query, sizeof(query), "SELECT * FROM user WHERE username='%e' AND passwort='%e'", Spielername(playerid), MD5_Hash(inputtext));
    mysql_tquery(Handle, query, "OnPasswordResponse", "i", playerid);
    }
    return 1;
    }


    Jetzt wird es zwar gehasht in der Datenbank aber kein Geld und Level wird abgespeichert und nach nem relogg kann ich mich nicht mehr anmelden... Ich weis nicht weiter dafür fehlt mir einfach die Übung ^^

    - heftig abhängig von Karli Kugelblitz Choco Drinks