Register/Login Sicherheit

  • VB.NET

Es gibt 41 Antworten in diesem Thema. Der letzte Beitrag () ist von Loquax.

    Über PHP, das serverseitig auf die Datenbank zugreift und die entsprechenden Daten zurückgibt.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Hey,

    zuerst würd ich mir das Design der Datenbank überlegen. Was willst Du speichern? UserName, Password (als Hash, verschlüsselt), LoginZeiten und und und. Wenn das steht, dann lad Dir nen anständigen Editor für PHP runter und erstell ein Script, dass z. B. per POST die Daten, die Du aus Deinem VB Programm übergibst, verarbeitet. VB-seitig hab ich sowas bisher immer mit WebRequest erledigt. Eignet sich ganz gut dazu. PHP-seitig nimmst Du die Daten an, überprüfst diese und gibst das Ergebnis dieser Prüfung aus. Der WebRequest, bzw. der WebResponse kann diese Ausgabe des PHP-Programms lesen und entsprechend interpretieren.

    Ich geb Dir mal ein rudimentäres Beispiel:

    PHP-Quellcode

    1. $user = $_POST['userName'];
    2. $password = $_POST['userPassword'];
    3. $sql = "SELECT userPassword FROM yourTable WHERE userName='".$user."'";
    4. $result = mysql_query($sql);
    5. $rows = mysql_fetch_array($result);
    6. if (rows['userPassword'] == $password)
    7. {
    8. echo "Login OK";
    9. else
    10. echo "Password wrong!";
    11. }


    So könnte das evtl. aussehen. Ich bin nicht gut in PHP, da fragst Du am Besten Menschen, die sich gut damit auskennen oder wartest auf weitere Antworten hier. Ich mache es seit langem so, mag sein, dass es schönere Wege gibt, aber PHP interessiert mich nicht wirklich.

    So im Prinzip könnte so etwas aussehen.

    EDIT: Der PHP-Code wurde jetzt nicht getestet, hab ich ausm Kopf geschrieben.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    PHP-Quellcode

    1. <?php
    2. //an dieser stelle: Datenbankverbindung aufbauen
    3. $user = mysql_real_escape_string($_POST['userName']);
    4. $password = $_POST['userPassword'];
    5. $sql = "SELECT userPassword FROM yourTable WHERE `userName`='".$user."'";
    6. $result = mysql_query($sql);
    7. $rows = mysql_fetch_array($result);
    8. if($rows['userPassword'] == $password)
    9. {
    10. echo "Login OK";
    11. }
    12. else
    13. {
    14. echo "Password wrong!";
    15. }
    16. mysql_close();
    17. ?>


    Escaping hinzugefügt (!)
    Passwörter solltest du gehasht speichern, keinesfalls im Klartext!

    Eine gute Einführung für MySQL in Verbindung mit PHP findest du hier.

    Auch noch möglich wäre sowas:

    PHP-Quellcode

    1. $user = mysql_real_escape_string($_POST['userName']);
    2. $password = mysql_real_escape_string($_POST['userPassword']); //muss hierbei ebenfalls escapt werden
    3. $sql = "SELECT * FROM yourTable WHERE `userName`='".$user."' AND `userPassword`='".$password."'";
    4. //etc


    Dann würdest du am Ende prüfen, ob die Abfrage überhaupt erfolgreich war.
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Lukas“ ()

    Lukas schrieb:

    Escaping hinzugefügt (!)
    Passwörter solltest du gehasht speichern, keinesfalls im Klartext!


    Jo, danke. Ist sehr wichtig!!!!
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich habe dieses Tutorial verwendet.

    Da wird Benutzername und Passwort mit md5 verschlüsselt, ist das schlechter als es zu hashen?

    Bisher habe ich noch Probleme mit MD5, da es zu Fehlern kommt. So kann ich beliebig viele Accounts mit dem gleichen Namen erstellen und meine Login Daten werden immer als falsch angesehen. Ich vermute dass hierbei nicht md5 mit md5 verglichen wird, ich finde den Fehler aber leider nicht.

    Zu PHP:

    Wie baut man in PHP eine Verbindung zur Datenbank auf?
    Wofür ist das Escaping?
    Wie prüfe ich in Visual Basic mit Hilfe des PHP Skripts auf der Datenbank ob die Daten stimmen ohne die Datenbank Daten einzugeben?

    Danke für die Hilfe, echt super nett!
    Zeig uns deinen genauen Code, dann könen wir weitersehen.

    Der Grundgedanke bzw. Unterschied von Hash und Verschlüsselung ist dir geläufig?
    „Was daraus gefolgert werden kann ist, dass jeder intelligentere User sein Geld lieber für Bier ausgibt, um einen schönen Rausch zu haben, und nicht dieses Ranzprodukt.“

    -Auszug aus einer Unterhaltung über das iPhone und dessen Vermarktung.
    Eine Verbindung zu einer Datenbank sieht so aus:

    PHP-Quellcode

    1. <?php
    2. $user = "userName";
    3. $pass = "password";
    4. $server = "localhost";
    5. $connection = mysql_connect($server,$user,$pass);
    6. mysql_select_db("yourDatabase");
    7. ?>


    Diese Datei kannst Du z. B. dbconnection.php nennen und in jedem anderen script "includen", wo Du eine Datenbankverbindung brauchst.

    PHP-Quellcode

    1. <?php
    2. include "dbconnection.php";
    3. //Hier der PHP-Code.
    4. ?>
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Oh okay, wieder was dazu gelernt :D

    Hash müsste nicht umkehrbar sein, wenn man nicht gerade das Ausgangswort kennt. Zum Beispiel sind Hashs von Wörtern wie "Test" bekannt.

    Hier der Code für Register:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class Registrierung
    3. Private Sub btnRegister_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnRegister.Click
    4. If txtPasswort.Text = txtPasswort_w.Text Then
    5. If txtEmail.Text.Contains("@") And txtEmail_w.Text.Contains("@") Then
    6. If txtEmail.Text = txtEmail_w.Text Then
    7. Dim conn As MySqlConnection
    8. conn = New MySqlConnection
    9. conn.ConnectionString = "server=localhost;" & "user id=root;" & "password=;" & "database=Spiel"
    10. Try
    11. conn.Open()
    12. Catch myerror As MySqlException
    13. MsgBox("Verbindung zum Server nicht möglich : " & myerror.Message.ToString)
    14. End Try
    15. Dim myAdapter As New MySqlDataAdapter
    16. Dim SQLAbfrage As String = "SELECT * FROM users WHERE Benutzername='" + txtBenutzername.Text + "'"
    17. Dim myCommand As New MySqlCommand
    18. myCommand.Connection = conn
    19. myCommand.CommandText = SQLAbfrage
    20. myAdapter.SelectCommand = myCommand
    21. Dim myData As MySqlDataReader
    22. myData = myCommand.ExecuteReader()
    23. If myData.HasRows = 0 Then
    24. conn.Close()
    25. conn.Open()
    26. Dim registerfinal As New MySqlDataAdapter
    27. Dim benutzer As String = MD5StringHash(txtBenutzername.Text)
    28. Dim passwort As String = MD5StringHash(txtPasswort.Text)
    29. myCommand.CommandText = "INSERT INTO users(Benutzername, Passwort, Email)" & "VALUES('" & benutzer & "','" & passwort & "','" & txtEmail.Text & "')"
    30. myCommand.ExecuteNonQuery()
    31. MsgBox("Der Account mit dem Namen : " & txtBenutzername.Text & " wurde erfolgreich erstellt")
    32. conn.Close()
    33. Else
    34. MsgBox("Dieser Benutzername existiert bereits")
    35. End If
    36. Else
    37. MsgBox("Die eingegebenen Emailadressen stimmen nicht überein")
    38. End If
    39. Else
    40. MsgBox("Die eingegebenen Emailadressen sind ungültig")
    41. End If
    42. Else
    43. MsgBox("Die eingegebenen Passwörter stimmen nicht überein")
    44. End If
    45. End Sub
    46. End Class


    Hier der Code für Login:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports MySql.Data.MySqlClient
    2. Public Class Login
    3. Private Sub btnLogin_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLogin.Click
    4. Dim conn As MySqlConnection
    5. conn = New MySqlConnection
    6. conn.ConnectionString = "server=localhost;" & "user id=root;" & "password=;" & "database=Spiel"
    7. Try
    8. conn.Open()
    9. Catch myerror As MySqlException
    10. MsgBox("Verbindung zum Server nicht möglich : " & myerror.Message.ToString)
    11. End Try
    12. Dim benutzer As String = MD5StringHash(txtBenutzername.Text)
    13. Dim passwort As String = MD5StringHash(txtPasswort.Text)
    14. Dim myAdapter As New MySqlDataAdapter
    15. Dim SQLAbfrage As String = "SELECT * FROM users WHERE Benutzername='" + Replace(benutzer, " ", "") + "' AND Passwort='" & Replace(passwort, " ", "") & "'"
    16. Dim myCommand As New MySqlCommand
    17. myCommand.Connection = conn
    18. myCommand.CommandText = SQLAbfrage
    19. myAdapter.SelectCommand = myCommand
    20. Dim myData As MySqlDataReader
    21. myData = myCommand.ExecuteReader()
    22. If myData.HasRows Then
    23. MsgBox("Erfolgreich eingeloggt")
    24. conn.Close()
    25. conn.Open()
    26. Else
    27. MsgBox("Die Logindaten sind falsch")
    28. End If
    29. End Sub
    30. End Class


    Die User daten werden gehasht auf der Datenbank gespeichert, aber es kommt offenbar zu Problemen, wenn ich versuche die eingegebenen Daten mit denen auf der Datenbank zu vergleichen. Wie löse ich das Problem?

    'Edit' code tags durch vb tags ersetzt :)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Loquax“ ()

    Ähm, ich bin jetzt ein bisschen verwirrt. Hast Du bei Dir lokal einen MySQL-Server laufen oder hast Du im Netz einen, der Dir den Zugriff von extern erlaubt? Ich bin davon ausgegangen, dass Du keinen externen Zugriff hast. Klär uns mal bitte auf, und sag uns, was Du genau damit bezwecken willst, sonst geben wir Dir falsche Informationen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ich hab zum Testen einen lokalen, aber das Programm sollte schon mit einem nicht zugänglichen externen Server funktionieren, denn sonst müsste ich ja meinen PC immer laufen lassen, damit Leute sich registrieren und einloggen können.
    Wenn das so ist und Du künftig keinen externen Zugriff auf Deine Datenbank hast, dann kannst Du den Code, den Du uns gepostet hast, nicht gebrauchen. Dieser Code greift nämlich direkt auf die Datenbank zu, ohne dass PHP hier eine Rolle spielt. Ich hoffe, das ist Dir klar.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ja, das ist mir klar, aber wie greife ich denn in VB auf ein PHP Skript zu, welches auf einem Server liegt auf den ich keinen Zugriff habe?
    Das PHP Skript ist ja aktuell nur dazu da um die Login Daten zu überprüfen, aber wie prüfe ich dann ob ein User schon existiert und wie schreibe ich neue User in die Datenbank, wenn ich keinen Zugriff habe? Geht das alles über PHP?

    Das PHP Skript müsste ja so aussehen, oder?:

    PHP-Quellcode

    1. <?php
    2. $user = "userName";
    3. $pass = "password";
    4. $server = "localhost";
    5. $connection = mysql_connect($server,$user,$pass);
    6. mysql_select_db("Spiel");
    7. $user = mysql_real_escape_string($_POST['Benutzername']);
    8. $password = $_POST['Passwort'];
    9. $sql = "SELECT Passwort FROM users WHERE `Benutzername`='".$user."'";
    10. $result = mysql_query($sql);
    11. $rows = mysql_fetch_array($result);
    12. if($rows['Passwort'] == $password)
    13. {
    14. echo "Login war erfolgreich";
    15. }
    16. else
    17. {
    18. echo "Die Logindaten sind falsch";
    19. }
    20. mysql_close();
    21. ?>


    Hier mal eine Übersicht, damit ihr wisst wie meine Datenbank aufgebaut ist:

    Datenbank: Spiel
    Tabelle: users
    Felder: Benutzername, Passwort, ID, Email usw.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Loquax“ ()

    Nein, Du verstehst das falsch. Du hast selbstverständlich Zugriff auf Deine .php, .html Dateien. Nur ist es wohl abhängig vom Hoster, ob ein externer Zugriff auf die MySQL-Datenbank möglich ist. Hattest noch nicht viel damit zu tun, oder? Auf Deinen Webspace hast Du immer Zugriff, nur die Datenbanken sind meistens nur erreichbar, wenn die Anfragen aus Sicht des Webservers lokal erfolgen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Ja, aber das Programm greift ja immer extern zu, darum geht es ja. Mir ist schon klar, dass ich persönlich immer Zugriff habe^^ "Ich" war in diesem Fall mein Programm

    Wenn externer Zugriff möglich ist, erscheint doch nur eine Passwort Abfrage oder? Dann kann ich ja im Prinzip direkt mein System verwenden, weil dann die Daten wieder im Code stehen.

    Wenn externer Zugriff nicht möglich ist, verwendet man PHP, richtig?

    Aber wie verwende ich nun das PHP Skript in Verbindung mit VB?
    Wenn kein externer Zugriff möglich ist, dann bleibt Dir nur der Umweg über PHP, das ist richtig. Hier im Showroom gibt es das:

    vb-paradise.de/sonstiges/showr…ontrols/66171-mysqllib-3/

    Diese .dll nimmt Dir hierbei ne Menge Arbeit ab. Echt gut das Ding, solltest Du mal ansehen.

    Wenn Du externen Zugriff hast, dann kannst Du den Code, den Du aus dem Tut hast verwenden.

    Ein Zugriff auf eine PHP-Datei kann so aussehen. Ein Beispiel. Auch hier gilt: Gibt auch andere Methoden und ich garantiere auch nicht die Fehlerfreiheit. Habs grad rausgekramt:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. Dim posterName As String = Me.TextBox1.Text
    3. Dim message As String = Me.TextBox2.Text
    4. Dim timeStamp As String = Now.ToShortDateString() & " " & Now.ToShortTimeString()
    5. Dim hReq As HttpWebRequest = CType(HttpWebRequest.Create("url of your php-file"), HttpWebRequest)
    6. Dim hRes As HttpWebResponse = Nothing
    7. Dim postData As String = "timeStamp=" & timeStamp & "&posterName=" & posterName & "&message=" & message
    8. Dim postBytes() As Byte = System.Text.Encoding.UTF8.GetBytes(postData)
    9. Dim reqStream As Stream = Nothing
    10. Dim resStream As Stream = Nothing
    11. Dim sR As StreamReader = Nothing
    12. Dim result As String = ""
    13. hReq.Method = "POST"
    14. hReq.ContentType = "application/x-www-form-urlencoded"
    15. hReq.ContentLength = postBytes.Length
    16. reqStream = hReq.GetRequestStream()
    17. reqStream.Write(postBytes, 0, postBytes.Length)
    18. reqStream.Close()
    19. hRes = CType(hReq.GetResponse(), HttpWebResponse)
    20. resStream = hRes.GetResponseStream()
    21. sR = New StreamReader(resStream)
    22. result = sR.ReadToEnd()
    23. resStream.Close()
    24. sR.Close()
    25. MessageBox.Show(result)
    26. End Sub
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Das sieht schon ziemlich fortgeschritten aus :S Gibt es denn keine andere Möglichkeit z.B. die Daten im Code zu hashen/verschlüsseln, damit ich meine schon fast fertige Methode verwenden kann? PHP würde zwar riesige Vorteile mit sich bringen, aber vom obenstehenden Code verstehe ich absolut Null,gar nichts^^

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Loquax“ ()

    Wie man einen MD5-Hash erstellt, steht doch im Tut. Und was das nicht verstehen angeht, so bleibt Dir nur lernen. Mach kleine Projekte, leg Dir ein Buch zur Seite und probiere und probiere. Mach nicht gleich sowas in der Art.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o