2016-04-06 27 views
0

Ich versuche, ein Register für die Verwendung von MySQL-Tabelle zu erstellen, als wenn Benutzername und Pass bereits hinzugefügt wurde es eine msgbox ausgeben, sagen Sie bereits registriert, aber was passiert ist, dass es immer es sogar wenn hinzufügen es ist bereits vorhanden ..Überprüfung, ob der Benutzer bereits registriert ist

Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 
    Dim cn As New SqlConnection 
    Dim cmd As New SqlCommand 
    Dim cmd2 As New SqlCommand 
    Dim dr As SqlDataReader 
     cn.ConnectionString = "Server=localhost;Database=test;Uid=sa;Pwd=fadyjoseph21" 
     cmd.Connection = cn 
    cmd.CommandText = "INSERT INTO test2(Username,Password) VALUES('" & TextBox1.Text & "','" & TextBox2.Text & "')" 
    cmd2.CommandText = cmd.CommandText = "SELECT username, password FROM test2 WHERE username = '" & TextBox1.Text & "' and password = '" & TextBox2.Text & "'" 
    cn.Open() 
    MsgBox("Registered") 
    cmd.ExecuteNonQuery() 
    dr = cmd.ExecuteReader 
    If dr.HasRows Then 
     MsgBox("You're already registered") 
    End If 
End Sub 

End Class

+3

Zeichne keine Zeichenketten, um SQL zu erstellen. Verwenden Sie SQL-Parameter. Ihr Code stürzt bei allen irischen und französischen Namen ab (zB: 'Mike O'Toole',' Joan D'Arc') und ist anfällig für SQL-Injection. Passwörter nicht als Klartext speichern; Hasch und salze sie. Ist das alles was du von einem neuen Benutzer brauchst ist ein Name und PW? Keine Email? Keine PW-Wiederherstellungsfrage? – Plutonix

+0

Zusätzlich zu was Plutonix schrieb: 1) Sie sollten nur überprüfen, ob der Benutzername bereits in der Datenbank ist. 2) Sie sollten 'cmd.ExecuteNonQuery()' erst verwenden, nachdem Sie überprüft haben, ob der Benutzername bereits existiert. 3) Sie scheinen 'cmd' anstelle von' cmd2' zu verwenden, um die Überprüfung durchzuführen. –

+0

Mmm. Hash und Salz. –

Antwort

0

einzigartige Schlüsseleinschränkung für Benutzernamen hinzufügen und somit, wenn es bereits vorhanden sein wird es doppelten Eintrag Ausnahme auslösen.

Zweitens, nie speichern Klartext Passwort in der Datenbank, es muss hasheh und verschlüsselt sein. Ich würde vorschlagen, besser Bcrypt von atleast level 10 zu verwenden, um Hash-Passwort zu generieren und auch Bcrypt dynamisches Salz zu verwenden, das jetzt am meisten bevorzugt wird.

Drittens, verwenden Sie immer parametrisierte Abfrage, um Ihr Programm von mysql-Injektion zu vermeiden. Zum Beispiel: -

Normal:

SELECT * FROM customers WHERE username = 'timmy' 

Injektion:

SELECT * FROM customers WHERE username = '' OR 1'' 
1

Sie überprüfen eigentlich nie zu sehen, ob der Benutzername vorhanden ist.

Sie definieren eine Abfrage hier:

cmd2.CommandText = cmd.CommandText = "SELECT username, password FROM test2 WHERE username = '" & TextBox1.Text & "' and password = '" & TextBox2.Text & "'" 

aber nie die Abfrage auszuführen. Stattdessen führen Sie einfach die INSERT Abfrage:

dr = cmd.ExecuteReader 

So wird die INSERT immer durchgeführt. Und da eine INSERT Zeilen nicht zurückgibt, sehen Sie das Meldungsfeld nicht.


Das erste, was der erste, fixieren Sie Ihre SQL-Injection-Schwachstelle. (Personal Politik, ich weiß nicht wie SQL-injizierbare Code in einer Antwort zu schreiben.) Verwenden Sie Abfrageparameter anstatt direkt verketten Benutzereingabe als Code:

cmd2.CommandText = "SELECT * FROM test2 WHERE username = @Username" 
cmd2.Parameters.Add("@Username", SqlDbType.VarChar, 50).Value = TextBox1.Text 
dr = cmd2.ExecuteReader 
If dr.HasRows Then 
    MsgBox("You're already registered") 
    Return 
End If 

Hinweis ein paar Dinge hier:

  • Die Verwendung eines Abfrageparameters. Ich musste den Typ und die Größe der Spalte in der Datenbank erraten, passen Sie sie gegebenenfalls an.
  • Nur Ausführen dieser Abfrage. Versuchen Sie nicht, beide Abfragen gleichzeitig auszuführen, führen Sie die erste aus und führen Sie dann die zweite aus.
  • Sie brauchen nicht, oder sogar wollen, um das Passwort in diese Abfrage aufzunehmen. Sie überprüfen, ob der Benutzername bereits existiert, das ist alles.
  • Return nach dem Anzeigen der Nachricht, so dass der Rest der Funktion nicht ausgeführt wird.

Dann, nachdem das geschehen ist, können Sie die INSERT Operation durchführen:

cmd.CommandText = "INSERT INTO test2(Username,Password) VALUES(@Username,@Password)" 
cmd.Parameters.Add("@Username", SqlDbType.VarChar, 50).Value = TextBox1.Text 
cmd.Parameters.Add("@Password", SqlDbType.VarChar, 50).Value = TextBox2.Text 
cmd.ExecuteNonQuery() 

Dies wird die INSERT Operation durchführen. Also, wenn die Return oben nie getroffen wurde, dann ist der Benutzername eindeutig und kann eingefügt werden.


auch: Sie sollten keine Benutzerkennwörter im Klartext sein zu speichern. Dies ist grob unverantwortlich an Ihre Benutzer und stellt ihre privaten Daten an Angreifer. Stattdessen obscure the password with a one-way hash, so dass es nicht in seiner ursprünglichen Form gelesen werden kann.


Ein paar andere Dinge:

  • Verwenden Sie aussagekräftige Variablennamen. Der Grund, warum Sie dieses Problem hatten, war, dass Sie zwischen cmd und cmd2 verwirrt waren. Wenn Ihre Variablennamen eine semantische Bedeutung haben, ist Ihr Code viel einfacher zu lesen und zu verstehen.
  • Verwenden Sie the Using block, wenn Sie verfügbare Ressourcen wie eine Datenbankverbindung haben. Im Allgemeinen möchten Sie eine Datenbankverbindung in einem möglichst kleinen Umfang öffnen, verwenden und schließen. Offene Verbindungen zu lassen ist eine schlechte Sache.
Verwandte Themen