1-2 Fragen von einem neuling

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Trade.

    1-2 Fragen von einem neuling

    Guten Tag zusammen,

    ich bin gerade dabei für unseren Tribe (Ark) ein "Zuchtbuch" zu erstellen damit wir da unsere Dinos eintragen können um eine Ordentliche Übersicht für die Zucht zu haben.
    Ich habe mir auch schon einiges zusammengesucht was auch funktioniert, hier mal der Code:

    Das Login Script:

    VB.NET-Quellcode

    1. ​Imports System.Security.Cryptography
    2. Imports System.Text
    3. Public Class Login
    4. Public Function MD5StringHash(ByVal strString As String) As String
    5. Dim MD5 As New MD5CryptoServiceProvider
    6. Dim Data As Byte()
    7. Dim Result As Byte()
    8. Dim Res As String = ""
    9. Dim Tmp As String = ""
    10. Data = Encoding.ASCII.GetBytes(strString)
    11. Result = MD5.ComputeHash(Data)
    12. For i As Integer = 0 To Result.Length - 1
    13. Tmp = Hex(Result(i))
    14. If Len(Tmp) = 1 Then Tmp = "0" & Tmp
    15. Res += Tmp
    16. Next
    17. Return Res
    18. End Function
    19. Private Sub btn_exit_Click(sender As Object, e As EventArgs) Handles btn_exit.Click
    20. Application.Exit()
    21. End Sub
    22. Private Sub btn_login_Click(sender As Object, e As EventArgs) Handles btn_login.Click
    23. Dim webbrowser1 As New WebBrowser
    24. If TextBox1.Text = Nothing Then
    25. MsgBox("Keinen Benutzername eingegeben!")
    26. Else
    27. If TextBox2.Text = Nothing Then
    28. MsgBox("Kein Passwort eingegeben!")
    29. Else
    30. Dim pwstring As String = MD5StringHash(TextBox2.Text)
    31. webbrowser1.Navigate("http://www.google.de/login.php?username=" & TextBox1.Text & "&password=" & TextBox2.Text)
    32. Do While webbrowser1.ReadyState <> WebBrowserReadyState.Complete
    33. Application.DoEvents()
    34. Loop
    35. If webbrowser1.DocumentText.Contains("Login True") Then
    36. Zuchtbuch.Show()
    37. Me.Close()
    38. MessageBox.Show("Anmeldung Erfolgreich.")
    39. Else
    40. MessageBox.Show("Fehler bei der Anmeldung!")
    41. End If
    42. End If
    43. End If
    44. End Sub
    45. End Class


    PHP Login Scipt:

    PHP-Quellcode

    1. ​<?
    2. $verbindung = mysql_connect("127.0.0.1", "username", "password")
    3. or die("Verbindung zur Datenbank konnte nicht hergestellt werden");
    4. mysql_select_db("dbname") or die ("Datenbank konnte nicht ausgewählt werden");
    5. $passwort=$_GET["password"];
    6. $username=$_GET["username"];
    7. if ($_GET["password"] == "") {
    8. die("Benutzername leer");
    9. }
    10. $abfrage = "SELECT * FROM login WHERE users = '$username' LIMIT 1";
    11. $ergebnis = mysql_query($abfrage);
    12. if(mysql_num_rows($ergebnis) == 1) {
    13. $row = mysql_fetch_object($ergebnis);
    14. if(password_verify($passwort,$row->pwd))
    15. {
    16. echo "Login True";
    17. }
    18. else
    19. {
    20. echo "Login False pwd";
    21. }
    22. } else {
    23. echo "Login False user";
    24. }
    25. ?>


    Eintragen in die MySQL Datenbank:

    VB.NET-Quellcode

    1. ​Imports MySql
    2. Imports MySql.Data
    3. Imports MySql.Data.MySqlClient
    4. Public Class Eintragen
    5. Dim MySqlConn As MySqlConnection
    6. Dim COMMAND As MySqlCommand
    7. Private Sub Eintragen_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    8. End Sub
    9. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    10. Me.Close()
    11. End Sub
    12. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    13. MySqlConn = New MySqlConnection
    14. MySqlConn.ConnectionString =
    15. "server=127.0.0.1;uid=username;pwd=password;database=dbname;"
    16. Dim READER As MySqlDataReader
    17. Try
    18. MySqlConn.Open()
    19. Dim Query As String
    20. Query = "INSERT INTO dinos (LoginID, dino_waehlen, zucht_wildfang, geschlecht, level, dinoname, gesundheit, ausdauer, sauerstoff, nahrung, gewicht, nahkampf) VALUES ('1', '" & dino_waehlen.Text & "', '" & zucht_wildfang.Text & "', '" & geschlecht.Text & "', '" & level.Text & "', '" & dinoname.Text & "', '" & gesundheit.Text & "', '" & ausdauer.Text & "', '" & sauerstoff.Text & "', '" & nahrung.Text & "', '" & gewicht.Text & "', '" & nahkampf.Text & "')"
    21. COMMAND = New MySqlCommand(Query, MySqlConn)
    22. READER = COMMAND.ExecuteReader
    23. Dim count As Integer
    24. MySqlConn.Close()
    25. MessageBox.Show("Dino Eingetragen.")
    26. Catch ex As MySqlException
    27. MessageBox.Show(ex.Message)
    28. Finally
    29. MySqlConn.Dispose()
    30. End Try
    31. End Sub
    32. End Class


    Zum ersten möchte ich die Login Daten für die Datenbank nicht im Tool stehen haben (da es einfach unsicher ist) und das gerne über eine PHP Bridge lösen. Des Weiteren soll der Login Name in die zweite Form weitergegeben werden um diese dann anschließend mit in die Datenbank einzutragen. Später muß das ganze auch noch ausgelesen und ausgegeben werden, aber dazu habe ich glaube schon eine gute Anleitung gefunden. Da ich bei dem Thema nicht weiterkomme und das gefundene nicht verstehe hoffe ich das man mir hier dabei vllt. etwas unter die Arme greifen kann.

    P.S. Ich habe kein großes Wissen was das Programmieren angeht alles was ich bisher habe ich durch Intensive googel suche erreicht.

    Vielen Dank bereits im voraus für eure Hilfe
    Grüße X0lfm4n
    Das ganze ist mehr als ein Thema, auch wenn es trivial erscheint, für einen Anfänger gibt es hier viele Stolpersteine.
    Schön ist schonmal das du selbst siehts, das es keine gute Idee ist das Datenbank Passwort im Quellcode der Anwendung zu haben, jedoch gibt es noch mehr Dinge die kritische Sicherheitslücken sind.
    1. MD5 ist schon lange nicht mehr sicher! Schau dir zb. password_hash an
    2. mysql* solltest du nicht mehr verwenden, gerade wenn du etwas neues entwickelst kannst du direkt zu mysqli oder pdo greifen mit prepared Statements.
    Im aktuellen Zustand könnte ein Angreifer ganz einfach eigene SQL-Queries absetzte und zb. deine Datenbank löschen.
    Stichwort: SQL-Injection
    3. Das Passwort über GET zu übertragen ist eine miese Idee, das taucht so in den Webserver Logs auf und kann dort ausgelesen werden.
    Zwar im ersten Moment nur von dir/dem Admin aber eine gute Idee ist es dennoch nicht, nutz lieber POST

    Ich würde eine API in PHP implementieren, die verschiedene Aktionen (Auth, List/Add/Update/Remove Dinos) mit entsprechenden Parametern anbietet und die Werte validiert.
    Die kannst du dann über HttpRequest aufrufen und brauchst den "gammeligen" WebBrowser nicht.
    MD5 ist echt alt da hast du recht das wollte ich dann später auf SHA1 oder so ändern aber mir ging es erst einmal darum das es überhaupt funktioniert, hash ist natürlich auch eine Möglichkeit.
    MySQLi hab ich schon mal gehört, das kann ich mir gerne mal anschauen, danke für den Hinweis.
    SQL-Injection: ok wusste nicht das das so einfach geht

    Über so eine PHP API hatte ich auch schon überlegt, es aber verworfen weil ich dachte das wäre dafür wohl doch zu viel Aufwand.
    Das Problem ich wüsste da nicht einmal wo ich anfangen soll, daher wäre es super wenn du mir vllt. eine kleine Version davon erstellen kannst die ich mir dann entsprechend erweitern kann, vorrausgesetzt das ist nicht zu viel verlangt.
    Warum später, wenn man es direkt machen kann? Später hast du keine Lust mehr. Nimm einfach password_hash und password_verify und fang nicht an selbst irgendwelche Sachen zu basteln.

    Das mit der API wäre nicht viel Aufwand, im Gegenteil, es würde dir die Arbeit clientseitig wesentlich erleichtern, aber fertigen Code wirst du von mir nicht bekommen.
    Nimm ein Array als Whitelist für die Aktionen (User: Auth/UpdatePassword, Dinos: List/Add/Update/Delete), definiere eine Basisstruktur (zb. in JSON):

    JavaScript-Quellcode

    1. // Example 1
    2. {
    3. "Type": "User",
    4. "Action": "Auth",
    5. "Parameter":
    6. {
    7. "Username": "...",
    8. "Password": "..."
    9. }
    10. }
    11. // Example 2
    12. {
    13. "AuthToken": "...",
    14. "Type": "Dinos",
    15. "Action": "List"
    16. }
    17. // Example 3
    18. {
    19. "AuthToken": "...",
    20. "Type": "Dinos",
    21. "Action": "Add",
    22. "Parameter":
    23. {
    24. "Name": "...",
    25. "Sex": "...",
    26. "Level": 12,
    27. ...
    28. }
    29. }


    Und validiere die Werte, ob die gesendete Action in deinem Whitelist-Array vorkommt, escapte die Werte der Parameter um unerwünschte Zeichen unschädlich zu machen und was sonst noch so anfällt.

    PS: Wobei das jetzt eine sehr flache implementierung wäre, ich würde eigentlich noch einen Schritt weitergehen und über die URL arbeiten (mod_rewrite):

    Quellcode

    1. POST /api/user/auth
    2. Erzeugt ein Authtoken der X h gültig ist, wird in der DB abgelegt und dem Client übermittelt für andere Requests
    3. GET /api/dinos/list
    4. Gibt eine Liste/Array aller Dions zurück
    5. GET /api/dinos/list/$startIndex/$numberOfDinos
    6. Gibt eine Liste/Array von $numberOfDinos Dinos ab Position $startIndex zurück
    7. GET /api/dinos/view/$dinoid
    8. Gibt den Dino mit der $dinoid zurück
    9. POST /api/dinos/add
    10. POST /api/dinos/update
    11. GET /api/dinos/delete/$dinoid
    @X0lfm4n Willkommen im Forum. Bitte gebe Deinem Thread doch einen Titel, der sich auf den Inhalt Deiner Frage bezieht.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    puh ok wahrscheinlich sieht das gerade komplizierter aus als es ist aber wahrscheinlich hab ich es einfach nur noch nicht verstanden, ich werd mir das auf jeden fall noch genauer anschauen.

    inzwichen hab ich in einer separaten form mir was erstellt das ich das was ich eingetragen habe mir auch anzeigen lassen kann:

    Visual Basic-Quellcode

    1. Imports MySql
    2. Imports MySql.Data
    3. Imports MySql.Data.MySqlClient
    4. Public Class Archiv
    5. Dim MySqlConn As MySqlConnection
    6. Dim COMMAND As MySqlCommand
    7. Private Sub LoadTable_Click(sender As Object, e As EventArgs) Handles LoadTable.Click
    8. MySqlConn = New MySqlConnection
    9. MySqlConn.ConnectionString =
    10. "server=localhost;uid=username;pwd=password;database=dbname;"
    11. Dim SDA As New MySqlDataAdapter
    12. Dim dbDataSet As New DataTable
    13. Dim bSource As New BindingSource
    14. Try
    15. MySqlConn.Open()
    16. Dim Query As String
    17. Query = "select id, dino_waehlen, zucht_wildfang, geschlecht, level, dinoname, gesundheit, ausdauer, sauerstoff, nahrung, gewicht, nahkampf, mutter, vater from dinos"
    18. COMMAND = New MySqlCommand(Query, MySqlConn)
    19. SDA.SelectCommand = COMMAND
    20. SDA.Fill(dbDataSet)
    21. bSource.DataSource = dbDataSet
    22. DataGridView1.DataSource = bSource
    23. SDA.Update(dbDataSet)
    24. MySqlConn.Close()
    25. Catch ex As Exception
    26. MessageBox.Show(ex.Message)
    27. Finally
    28. MySqlConn.Dispose()
    29. End Try
    30. End Sub


    soweit so gut, jetzt möchte ich aber noch einbauen das wenn man sich vertippt hat man den eintrag auch bearbeiten kann.
    den button dazu würde ich gerne in dieser form erstellen und der soll mich dann in die andere wo ich die daten eingetragen habe zurückwerfen und die werte in den entsprechenden feldern wieder anzeigen
    ich habe dazu das gefunden:

    Visual Basic-Quellcode

    1. Private Sub Edit_Click(sender As Object, e As EventArgs) Handles Edit.Click
    2. MySqlConn = New MySqlConnection
    3. MySqlConn.ConnectionString =
    4. "server=localhost;uid=username;pwd=password;database=dbname;"
    5. Dim READER As MySqlDataReader
    6. MySqlConn.Open()
    7. Dim Query As String
    8. Query = "update dinos set ('1', dino_waehlen='" & dino_waehlen.Text & "', zucht_wildfang='" & zucht_wildfang.Text & "', geschlecht='" & geschlecht.Text & "', level='" & level.Text & "', dinoname='" & dinoname.Text & "', gesundheit='" & gesundheit.Text & "', ausdauer='" & ausdauer.Text & "', sauerstoff='" & sauerstoff.Text & "', nahrung='" & nahrung.Text & "', gewicht='" & gewicht.Text & "', nahkampf='" & nahkampf.Text & "', mutter='" & mutter.Text & "', vater='" & vater.Text & "') where id='" & & "'"
    9. COMMAND = New MySqlCommand(Query, MySqlConn)
    10. READER = COMMAND.ExecuteReader
    11. MessageBox.Show("Eintrag Aktualisiert")
    12. MySqlConn.Close()
    13. End Sub


    das problem ist nur das die felder ja in form1 sind und der button in form2 auserdem werden dann die werte nicht in die felder eingetragen das müsste man dann wieder manuell machen
    wie kann ich ihm also sagen das sich die felder in form1 befinden und er die werte bitte wieder in die felder eintragen soll?
    uiuiuih - du fuhrwerkst da bereits mit Datenbanken, php-scripten und weßgottwas rum, aber vermutlich kennst du noch nichtmal den Begriff "Datenmodell".
    Eine Datenverarbeitung kann aber nix werden, wenn man nicht beim Datenmodell anfängt.
    Was - neben Sql-Injection auch ganz ungünstig ist, ist, dass du scheints keine anderen Datentypen zu kennen scheinst als String.

    Also ich würde dir dringend empfehlen, erarbeite dir erstmal datenbänkerisches Grundwissen, dann konzipiere ein für deine Zwecke angemessenes Datenmodell, und - wenn unbedingt wolle - erst dann die Datenbank aufsetzen.

    Ich aber würde von einer Db erstmal dringend abraten. Programmier deine Anwendung erstmal mit einer einfachereren Datensenke fertig - Db kannste später immer noch hinterlegen.

    Tutorial zu datenbänkerischem Grundwissen (und ausserdem Alternative Datensenke):
    codeproject.com/Articles/10309…l-Datamodel-for-Beginners
    @X0lfm4n Und es wäre hilfreich, wenn Du diesem Deinem Thread einen Titel gibt, der Dein Problem kurz beschreibt.
    Editiere bitte den Titel.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich weiß Sicherheit ist wichtig und es gibt sicher bessere Möglichkeiten das ganze umzusetzen, allerdings soll das Tool ja nicht an die breite Masse gehen, sondern nur an ein paar einzelne Personen die absolut kein Interesse daran haben da irgend etwas zu manipulieren, zu zerstören oder ähnliches. Im Moment möchte ich nur das das Tool die Funktionen hat die wir brauchen und sonst nichts. Wenn das erledigt ist kann ich mich gerne näher mit dem ganzen befassen und es in Uhr noch einmal neu machen aber im Moment ist das für uns einfach nicht notwendig.

    Ich würde mich daher freuen wenn etwas mehr auf meine Fragen eingegangen wird und nach Möglichkeit ohne fachgelaber, wie ich am Anfang schon geschrieben habe fange ich mit dem ganzen erst an und da macht man nun mal Fehler.

    X0lfm4n schrieb:


    1.) Ich würde mich daher freuen wenn etwas mehr auf meine Fragen eingegangen wird und nach Möglichkeit ohne fachgelaber,
    2.) wie ich am Anfang schon geschrieben habe fange ich mit dem ganzen erst an und da macht man nun mal Fehler.


    zu 1.) Also du möchtest fertigen Code ? Dann gehe in den Marktplatz. Die User die hier gepostet haben, haben dir hier super Vorschläge gemacht.
    Setze diese um und bei weiteren Fragen dazu fragst du hier einfach nach dafür ist das Forum da. Verstehe nicht wo das Problem ist die Tipps
    hier umzusetzen ?

    zu 2.) Und mit unter genau deswegen weil du gerade erst Anfängst solltest du wenn schon RICHTIG anfangen und nicht erst falsch.
    Du hast hier die bestmögliche Hilfe um es gleich von Anfang an richtig zu machen.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen

    X0lfm4n schrieb:

    nach Möglichkeit ohne fachgelaber
    Wenn Du willst, dass Dir hier effizient geholfen wird, wäre es

    RodFromGermany schrieb:

    hilfreich, wenn Du diesem Deinem Thread einen Titel gibt, der Dein Problem kurz beschreibt.
    Dann sehen nämlich Leute hier rein, die sich vom Titel angesprochen fühlen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!