VB.net Benutzeranmeldung

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Holistiker.

    VB.net Benutzeranmeldung

    Hallo,

    ich bin dabei eine Benutzeranmeldung zu erstellen. Die Daten des Benutzers (Username und Passwort) stehen in einer Access-Mdb-Datei. Ebenso gibt es für jeden Benutzer 15 Checkboxes.


    Ich bin jetzt soweit, dass ich abfragen kann ob ein Benutzer in der Datenbank steht und wenn eine bestimmte CheckBox = True ist soll eine von 15 TabPages sichtbar sein.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim con As New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\12345678.mdb")
    3. con.Open()
    4. '1
    5. Dim d As OleDbCommand = New OleDbCommand("SELECT * FROM Benutzer WHERE Benutzername = '" & TextBox1.Text & "' AND Passwort = '" & TextBox2.Text & "' AND 1 = 1", con)
    6. Dim dd As OleDbDataReader = d.ExecuteReader
    7. If dd.Read() = True Then
    8. Form4.Show()
    9. End If


    Ich möchte aber, dass jeder Benutzer unterschiedliche Checkboxes auf True hat und somit für jeden Benutzer das TabControl angepasst werden kann, sodass für jeden Benutzer andere TabPages sichtbar sind.
    Hat jemand eine Idee?

    *Topic verschoben*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Marcus Gräfe“ ()

    Du könntest eine weitere spalte in der Datenbank machen wo du für die Checkboxen werte setzt und diese dann mit auslesen.

    // Habe wohl deine Frage falsch verstanden.
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „C.O.D.E“ ()

    uNbRaKe schrieb:

    SELECT * FROM Benutzer WHERE Benutzername = '" & TextBox1.Text &
    NEIN!
    Dein Code ist äusserst gefährlich!
    Stichwort SQL Injection.
    Gib mal in die Textbox xx'; DROP TABLE Benutzer -- ein.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    uNbRaKe schrieb:

    Wenn ich das eingebe erscheint eine Fehlermeldung.

    Du hast das jetzt nicht wirklich eingegeben?
    Dann hast du Glück gehabt, dass ich im ersten Edit einen Syntaxfehler drin hatte.

    uNbRaKe schrieb:

    Wie sollte ich das dann lösen?
    Google nach SQL Injection und SQL Parameters.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod

    Das löst trotzem nur eine Fehlermeldung aus.

    Ich hab nach SQL Injection gegoogled aber ich hab ja nur eine TextBox-Eingabe die dann eine Access-Datenbank der Benutzer ausliest.

    ich habe versucht die Tabelle mit der Befehleingabe in die Textbox zu löschen passiert aber nichts.

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

    Worauf @petaod hinaus will ist: Über eine SQL Injection ist es möglich die komplette Datenbank zu Löschen,
    sich alle Benutzer anzeigen zu lassen und eigentlich alles was du mit der Datenbank auch machen kannst.

    Ich habe da mal für dich Google benutzt: stackoverflow.com/questions/98…ection-proofing-textboxes

    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „C.O.D.E“ ()

    Vielleicht musst du noch ein Blank hinter die ​-- anhängen.
    Ansonsten kann es natürlich auch sein, dass Access inzwischen gegen SQL Injection prüft.
    Dann hast du Glück. Aber verlassen darfst du dich nie darauf.
    Mit etwas Mühe kann man auch aus dem auskommentierten Anhang noch ein gültiges Statement machen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    uNbRaKe schrieb:

    If dd.Read() = True Then
    Form4.Show()
    Wenn man davon absieht, dass Vergleiche mit True redundant und somit überflüssig sind, riecht Form4.Show nach dieser Themenempfehlung: Dialoge richtig instanziieren
    Aber ich denke mal, dass C.O.D.E mit Post#2 einen möglichen Weg gezeigt hat. Wenn bei 15 CheckBoxen der User 1 die 1., 5., 8., und 13. gecheckt hat (haha), dann würd ich das so in der Datenbank hinterlegen: "100010010000100". Also ein String aus 1en und 0en, die eben angeben, ob ne CheckBox abhakt wurde oder nicht. Erste Stelle = Status erste CheckBox, 8. Stelle im String = Status der 8. CheckBox, 1 = Haken, 0 = kein Haken.


    DerDieDas GUI bleibt mir aber erstmal vom Aufbau rätselhaft.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Also ein String aus 1en und 0en, die eben angeben, ob ne CheckBox abhakt wurde oder nicht. Erste Stelle = Status erste CheckBox, 8. Stelle im String = Status der 8. CheckBox, 1 = Haken, 0 = kein Haken.


    Alternativ könnte er Trennzeichen nehmen ( , oder ; ) und diese anschließend mit Split() im Programm trennen. Ich denke aber auch das dein weg hier besser wäre da ich nicht weiß welche Rolle die Trennzeichen für SQL spielen ^^
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!

    uNbRaKe schrieb:

    Wo genau muss dann die Abfrage des Strings genau hin? Direkt in die Benutzerabfrage oder beim Form öffnen?

    Ja genau, du fragst das einfach ab wenn du den Benutzer abfragst!

    uNbRaKe schrieb:

    Wie würde so eine Abfrage aussehen?

    VB.NET-Quellcode

    1. Dim empty As String
    2. Dim s As String = "1;0;1;1;1;0"
    3. 'Erste stelle ist Checkbox1, 2te stelle Checkbox2 usw
    4. 'Checkbox 1 = Verfügbar
    5. 'Checkbox 2 = Nicht Verfügbar
    6. 'Checkbox 3 = Verfügbar
    7. 'Checkbox 4 = Verfügbar
    8. 'Checkbox 5 = Verfügbar
    9. 'Checkbox 6 = Nicht Verfügbar
    10. Dim werte As String() = s.Split(";")
    11. Dim wert As String
    12. For Each wert In werte
    13. empty = MessageBox.Show(wert)
    14. Next
    Liebe Grüße,
    C.O.D.E

    Testautomatisierung (TA):

    5%
    Du findest meinen Beitrag Hilfreich? :thumbup: Dann drück auf Hilfreich!
    Ich muss das ja dann in

    VB.NET-Quellcode

    1. ​Dim d As OleDbCommand = New OleDbCommand("SELECT * FROM Benutzer WHERE Benutzername = '" & TextBox1.Text & "' AND Passwort = '" & TextBox2.Text & "'", con)
    2. Dim dd As OleDbDataReader = d.ExecuteReader


    einbauen versteh ich das richtig?
    Und bei meiner Variante:

    VB.NET-Quellcode

    1. Dim CheckBoxFlagsForCurrentUser = "100011010010"
    2. For i = 0 To CheckBoxFlagsForCurrentUser.Count - 1
    3. MessageBox.Show($"Die {i + 1}. CheckBox ist {If(CheckBoxFlagsForCurrentUser(i) = "1", "mit", "ohne")} Haken.")
    4. Next

    Also den Char an der xten Stelle auswerten, um den Status der xten CheckBox zu erhalten.

    btw: @C.O.D.E: Option Strict On nicht vergessen: s.Split(";") Split akzeptiert so keine Strings. -> s.Split(";"c)

    @uNbRaKe: Das Abfragen des Statusstrings muss schon in den Abfragecomand. Du brauchst ihn ja. Das Auseinanderklamüsern und die Manipulation bzw. das Hakensetzen der CheckBoxen erfolgt dann später.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Die Schleife hab ich soweit verstanden und anstelle der CheckBoxFlagsForCurrentUser einen Wert zuzuweisen geb ich ja die Spalte in der Access-Datenbank an, doch wie genau bau ich das dann in meine Benutzerabfrage ein?

    Ich kann ja nicht

    VB.NET-Quellcode

    1. Dim CheckBoxFlagsForCurrentUser = Spalte der Access-Datenbank"
    schreiben oder?