Laden...

User können sich mit einem random Passwort anmelden / Was mache ich falsch

Erstellt von LittlePony vor 4 Jahren Letzter Beitrag vor 4 Jahren 1.808 Views
Thema geschlossen
L
LittlePony Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren
User können sich mit einem random Passwort anmelden / Was mache ich falsch

Hey,

ich hab folgendes Problem. Mein Code erlaubt es Nutzern komischerweise, sich mit einem Random Passwort anzumelden. Dieses Problem würde ich gerne lösen, und eventuelll den Code auch optimieren. Es wäre nett, wenn dazu jemand einen Tip hat. Hier folgendes Codeteil:


[RemoteEvent("loginUser")]
    public void loginUserEvent(Client player, String username, String password)
    {

        if (player.HasData("wait"))
        {
            player.SendNotification("Warte kurz...");
            return;
        }
        player.SetData("wait", true);
        using (MySqlConnection Mainpipeline = new MySqlConnection(Main.myConnectionString))
        {
            Mainpipeline.Open();
            MySqlCommand query = Mainpipeline.CreateCommand();
            query.CommandType = CommandType.Text;
            query.CommandText = "SELECT * FROM `users` WHERE ( `Username` = '" + username + "' OR `email` = '" + username + "')";
            query.ExecuteNonQuery();

            DataTable dt = new DataTable();
            using (MySqlDataAdapter da = new MySqlDataAdapter(query))
            {

                da.Fill(dt);

                int i = 0;
                i = Convert.ToInt32(dt.Rows.Count.ToString());
                if (i == 0)
                {
                    string query2 = "INSERT * FROM users (username, password) VALUES (@username, @password)";

                    MySqlCommand LoginAccount = new MySqlCommand(query2, Mainpipeline);

                    LoginAccount.Parameters.AddWithValue("@username", "" + username + "");
                    LoginAccount.Parameters.AddWithValue("@password", "" + AccountManage.ValidatePassword(username, password) + "");
                    LoginAccount.ExecuteNonQuery();

                    player.SendNotification("Falsche Daten!.");
                    player.ResetData("wait");
                }
                else
                {
                    NAPI.ClientEvent.TriggerClientEvent(player, "clearLoginWindow");
                    AccountManage.LoadAccount(player, username);
                    player.ResetData("wait");
                }
            }
        }

Hier noch der AccountManage Teil:

    private static string GetRandomSalt()
{
    return BCrypt.Net.BCrypt.GenerateSalt(10);
}

public static string HashPassword(string password)
{
    return BCrypt.Net.BCrypt.HashPassword(password, GetRandomSalt());
}

public static bool ValidatePassword(string username, string password)
{
    return BCrypt.Net.BCrypt.Verify(username, password);
}

Danke für eure Hilfe.

T
2.219 Beiträge seit 2008
vor 4 Jahren

Dein Code schreit förmlich SQL Injection 😦
Du solltest deinen Code dringend mal säubern.
Beim Insert nutzt du schon SQL Parameter, warum nicht auch beim Select?
Aktuell kann jeder per Username/Passwort bei dir SQL einfügen.

Ebenfalls solltest du deine SQL Anweisungen in den Data Layer packen bzw. sollte deine Anwendung vermutlich erst einmal auf die Drei Schichten Architektur gebracht werden!

Dein Code sieht nicht nach sinnvoller Strukturierung aus bzw. ergibt er nicht vollständig Sinn.
Du hast keine Logik um bei vorhanden Benutzer zu prüfen ob das Passwort gültig ist.
Entsprechend kann man scheinbar einfach an deinem Prozess vorbei, wenn es einen Benutzer mit Benutzername und Email gibt.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

L
LittlePony Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

Ja das Problem möchte ich ja gerne lösen. Wenn man eine gültige E-Mail eingibt, kommt man ohne passwort rein, allerdings funktioniert es einfach nicht wenn ich es anders schreibe. SLQi denke ich wird nicht das Problem sein, weil das Frontend ein Spiel ist welches keine anderen eingaben zulässt. Müsste nur die PAsswortabfrage ans laufen bekommen...

T
2.219 Beiträge seit 2008
vor 4 Jahren

Dann setzt doch die Logik um.
Aktuell speicherst du auch kein Passwort, wie willst du dann prüfen ob das Passwort auch stimmt?
Aktuell speicherst du anstelle des Passwort das bool Ergebnis von VerifyPasswort, was falsch ist.
Wenn es den Benutzer gibt, musst du auch prüfen ob das ausgelesen Passwort bzw. der Hash des Passwort mit dem Hash des übergebenen Passwort übereinstimmt.
Und genau diesen Schritt machst du in deinem else Block nicht.

Und hier musst du nun tätig werden und den Code zur Validierung des Passwort umsetzen.

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

L
LittlePony Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

Achso doch speichern tue ich in einem anderen Event, das funktioniert auch, und das passwort kommt auch gehasht in die DB. Wie ich das jetzt umschreibe das die Abfrage funktioniert muss ich dann schauen, aber danke dir schonmal für deine Hilfe & deinen Input. Bin noch neu auf dem Gebiet.

16.806 Beiträge seit 2008
vor 4 Jahren

Wenn "Nutzer" irgendwelche User im Internet sind, die Datenschutzgesetzen unterliegen dann zwingt Dich die Gesetzeslage sowieso das komplett anders - und vor allem sicher - zu machen.
Dazu gehört, dass die E-Mail Adressen genauso wenig im Klartext gespeichert werden dürfen wie das Passwort.
Während die E-Mail Adresse mit einem 2-Wege Verfahren verschlüsselt werden muss (was Dir durchaus die Datenbank abnehmen kann), muss ein Passwort entsprechend gesalzen und mit einem 1-Wege Hashverfahren behandelt werden.
Soviel mal zur technischen Mindestanforderung an sowas. Der Code sieht nicht so aus, dass Du diese Anforderungen erfüllst.

Dein gesamter Code ist derart vermischt, dass er weder wartbar noch testbar ist.
Siehe dazu [Artikel] Drei-Schichten-Architektur

Was das Konstrukt mit "Wait" auf sich hat; weiß ich nicht.
Sieht abenteuerlich und instabil aus. Vermutlich irgendeine Art "locking" weil Du es nicht besser wusstest, oder was ist der Zweck?

Ansonsten sehe ich nirgends eine Stelle, wo Du das Passwort auf sichere Art und Weise prüfst.

Ich erkenne leider auch nicht welche Art und Weise von Applikation das ist.
Denn eigentlich bietet Microsoft bzw. .NET bzw. die Community für alle Art von sicheren Authentifizierungsmaßnahmen schon fertige Frameworks an.

Niemand hat Lust Identity selbst zu machen.
Viel zu großes Risiko.

L
LittlePony Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

In dem Code geht es zu einem Login für einen Gameserver, nichts für die große Masse, nur zum testen / lernen. Abfrage für die Passwörter mach ich eigentlich hier:

public static bool ValidatePassword(string username, string password)
{
    return BCrypt.Net.BCrypt.Verify(username, password);
}

Gespeichert kommen die Passwörter so in der DB an:

$2a$10$N9qo8uLOickgx2ZMRZoMyeIjZAgcfl7p92ldGxad68LJZdL17lhWy

als Beispiel

Wo sollte ich denn jetzt anfangen? Eigentlich wollte ich nur die Passwort abfrage ans laufen bekommen 😄 Danke euch für eure Hilfe

16.806 Beiträge seit 2008
vor 4 Jahren

Du schreibst in Deinem Code ein INSERT - Du fügst also einen User in der Datenbank hinzu.
Wenn Du eine Username-Passwort-Abfrage eines existierenden Eintrag machen willst, dann brauchst Du ein SELECT (und eine Auswertung der Rückgabe, die Du auch nirgends hast).
Aktuell nimmst Du also jede Eingabe an, machst daraus ein neuen User, und sagst der Login war erfolgreich.

Die Hinweise, die wir Dir geben die dienen auch dazu, dass Du es gleich richtig lernst 😉
Gibt noch viele weitere Hinweise; aber denke das ist aktuell zuviel.
Aber Dein Hashen des Passworts sieht von den Grundzügen korrekt aus.

Edit:
Dein SQL Command ist eine Mischung aus SELECT und INSERT.
Das kann nicht klappen.

PS: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

L
LittlePony Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

Also ich lese mir seit Tagen die Augen wund, hab rumprobiert etc, es klappt einfach nicht.

Klar, ich hab INSERT auf SELECT geändert, aber ich will eigentlich nur das User sich einloggen können ^^ Mir wurde schon gesagt das in query.CommandText wohl nen fehler drin ist, aber ich komm einfach nicht weiter.

1.696 Beiträge seit 2006
vor 4 Jahren

Also ich lese mir seit Tagen die Augen wund, hab rumprobiert etc, es klappt einfach nicht.

Klar, ich hab INSERT auf SELECT geändert, aber ich will eigentlich nur das User sich einloggen können ^^ Mir wurde schon gesagt das in query.CommandText wohl nen fehler drin ist, aber ich komm einfach nicht weiter.

  1. ich sehe nirgends dass du password prüfst
  2. dein SELECT kann man schnell mit solcher Eingabe "1234 or 1=1" umgehen, also SQL-Injection gefährdet

behebe diese 2 Punkte, dann kannst du schauen, ob User noch ohne Weiteres rein kommt.

Ich bin verantwortlich für das, was ich sage, nicht für das, was du verstehst.

**:::

L
LittlePony Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

Huhu, danke für deine Antwort. Egal was ich Probiere, ich bekomme in der Console am Ende immer den Fehler "invalid Salt version".

16.806 Beiträge seit 2008
vor 4 Jahren
L
LittlePony Themenstarter:in
7 Beiträge seit 2020
vor 4 Jahren

Mit dem Debuggen will das nicht ganz hinhauen, die DLL die ich erstelle wird von der EXE zwar angenommen, aber ich krieg den Fehler das Visual Studio nicht auf die EXE zugreifen kann.

U
135 Beiträge seit 2009
vor 4 Jahren

Komisch, auf Stackoverflow scheint jemand das gleiche Problem zu haben 🤔
Und das auch noch mit dem identischen Code =)

Und erstaunlicherweise gibt man Dir dort die gleichen Antworten wie hier...

Hinweis von Abt vor 4 Jahren

Danke UncleBens, damit ist hier zu.
[Hinweis] Wie poste ich richtig?

Thema geschlossen