Puoi mostrare il codice "corretto"?
Il mio problema è che non mi fa la comparazione tra il valore delle taxtbox e il valore del db. Ora posto il codice completo:
Dim Pwd As String
Dim User As String
Dim strconn As String
Dim conn As OleDb.OleDbConnection
Dim myAdapter As OleDb.OleDbDataAdapter
Dim myCommand As OleDb.OleDbCommand
strconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Documents and Settings\Utente\Documenti\Progetti VB\RemedyDB.mdb'"
conn = New OleDb.OleDbConnection(strconn)
conn.Open()
User = "SELECT Username FROM Utenti WHERE Username = '" & nomeUtente.Text & "'"
Pwd = "SELECT Password FROM Utenti WHERE Username = " & nomeUtente.Text
myCommand = New OleDb.OleDbCommand(User, conn)
myAdapter = New OleDb.OleDbDataAdapter(myCommand)
Dim result As OleDb.OleDbDataReader
result = myCommand.ExecuteReader
If result.HasRows = 0 Then
MsgBox("Query eseguita non correttamente")
Else
MsgBox("Query eseguita correttamente")
End If
If nomeUtente Is Nothing OrElse nomeUtente.Text = "" Then
MessageBox.Show("Inserire l'username per accedere.", "ERRORE", MessageBoxButtons.OK)
Exit Sub
End If
If password Is Nothing OrElse password.Text = "" Then
MessageBox.Show("Inserire la password per accedere.", "ERRORE", MessageBoxButtons.OK)
Exit Sub
End If
If nomeUtente.Text.Equals(User) And password.Text.Equals(Pwd) Then
MessageBox.Show("Login eseguito correttamente.", "Login", MessageBoxButtons.OK)
Else
MessageBox.Show("Username o password errati", "Login", MessageBoxButtons.OK)
'MessageBox.Show("Username= " & User & " Password= " & Pwd, "Login", MessageBoxButtons.OK)
End If
conn.Close()
myAdapter.Dispose()
myCommand.Dispose()
conn.Dispose()
Il problema sta nel fatto che non mi entra nell'if ma va sempre nell'else.Originariamente inviato da Scorpio2010
If nomeUtente.Text.Equals(User) And password.Text.Equals(Pwd) Then
MessageBox.Show("Login eseguito correttamente.", "Login", MessageBoxButtons.OK)
Else
MessageBox.Show("Username o password errati", "Login", MessageBoxButtons.OK)
'MessageBox.Show("Username= " & User & " Password= " & Pwd, "Login", MessageBoxButtons.OK)
End If
Quel confronto non ha senso, in User e Pwd c'è il testo delle query che hai effettuato al DB, non i loro risultati!
E in ogni caso:
- usa le query parametriche, maremma cinghiala, chiunque non usi query parametriche, specie durante l'autenticazione, meriterebbe l'interdizione a vita da qualunque strumento informatico;
- non memorizzare le password in plaintext nel DB, altro misfatto per cui prevederei la stessa pena. Nel DB si memorizzano gli hash delle password, così che il programma quando l'utente inserisce una password ne computa l'hash e lo confronta con quello situato nel DB; se coincidono l'autenticazione è riuscita, se no niente. In questa maniera la privacy degli utenti è garantita (il db admin non deve poter conoscere le password degli utenti, specie visto che si sa che gli utenti riciclano spesso le stesse password per più servizi), e in più un eventuale cracker che ottenesse un dump del database non lo potrebbe comunque sfruttare per accedere all'applicazione con i dati degli utenti.
Amaro C++, il gusto pieno dell'undefined behavior.
Il programma che sto facendo è un programma di utilità che serve per automatizzare alcune azioni che sono "stupide" e ripetitive. Gli utenti che andranno ad utilizzare questo programma sono persone che non hanno interesse a manomettere il programma, perchè ciò andrebbe a loro discapito.Originariamente inviato da MItaly
Quel confronto non ha senso, in User e Pwd c'è il testo delle query che hai effettuato al DB, non i loro risultati!
E in ogni caso:
- usa le query parametriche, maremma cinghiala, chiunque non usi query parametriche, specie durante l'autenticazione, meriterebbe l'interdizione a vita da qualunque strumento informatico;
- non memorizzare le password in plaintext nel DB, altro misfatto per cui prevederei la stessa pena. Nel DB si memorizzano gli hash delle password, così che il programma quando l'utente inserisce una password ne computa l'hash e lo confronta con quello situato nel DB; se coincidono l'autenticazione è riuscita, se no niente. In questa maniera la privacy degli utenti è garantita (il db admin non deve poter conoscere le password degli utenti, specie visto che si sa che gli utenti riciclano spesso le stesse password per più servizi), e in più un eventuale cracker che ottenesse un dump del database non lo potrebbe comunque sfruttare per accedere all'applicazione con i dati degli utenti.
Per quanto riguarda le query parametriche ora mi informo.
Per quanto riguarda quello che hai scritto sulla memorizzazione delle password mi sembra arabo e pertanto ti chiedo la cortesia di spiegarti meglio.
Non ha importanza, lo smanettone di turno è sempre in agguato, e si tratta di normalissime best-pratices che è bene seguire, anche perché non costa nessuna fatica. L'uso del metodo ExecuteReader fa sì che in questo caso sia impossibile modificare il DB via SQL injection, ma non impedisce comunque l'inserimento di comandi SQL non desiderati nella tua query, che possono sempre dare problemi. Inoltre se non usi le query parametriche nemmeno quando fai degli INSERT o degli UPDATE allora il già citato burlone di turno ti può facilmente distruggere il DB.Originariamente inviato da Scorpio2010
Il programma che sto facendo è un programma di utilità che serve per automatizzare alcune azioni che sono "stupide" e ripetitive. Gli utenti che andranno ad utilizzare questo programma sono persone che non hanno interesse a manomettere il programma, perchè ciò andrebbe a loro discapito.
Eh però animo, è due settimane che ti abbiamo segnalato il problema.Per quanto riguarda le query parametriche ora mi informo.
Cosa non ti è chiaro?Per quanto riguarda quello che hai scritto sulla memorizzazione delle password mi sembra arabo e pertanto ti chiedo la cortesia di spiegarti meglio.
Amaro C++, il gusto pieno dell'undefined behavior.
Hai ragione però è pure vero che sono mancato dal lavoro per una settimana e quindi non ci ho potuto mettere mano e inoltre quando sto al lavoro ci posso lavorare solo la mattina.Eh però animo, è due settimane che ti abbiamo segnalato il problema
Sono riuscito a trovare su internet il modo per fare le query parametriche, anche se però ci sono degli errori nella query. Ora posto il codice:
Dim Pwd As String
Dim User As String
Dim strconn As String
Dim conn As OleDb.OleDbConnection
Dim myAdapter As OleDb.OleDbDataAdapter
Dim myCommand As OleDb.OleDbCommand
strconn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source='C:\Documents and Settings\Utente\Documenti\Progetti VB\RemedyDB.mdb'"
conn = New OleDb.OleDbConnection(strconn)
conn.Open()
'User = "SELECT Username FROM Utenti WHERE Username = '" & nomeUtente.Text & "'"
'Pwd = "SELECT Password FROM Utenti WHERE Username = " & nomeUtente.Text
User = "SELECT Username FROM Utenti WHERE Username = ?"
Pwd = "SELECT Password FROM Utenti WHERE Username = ?"
myCommand = New OleDb.OleDbCommand(User, conn)
myAdapter = New OleDb.OleDbDataAdapter(myCommand)
myCommand.Parameters.AddWithValue("Username", nomeUtente.Text)
Dim result As OleDb.OleDbDataReader
result = myCommand.ExecuteReader
If result.HasRows = 0 Then
MsgBox("Query eseguita non correttamente")
Else
MsgBox("Query eseguita correttamente")
End If
...
Il problema sta nella stringa select... Username = ? infatti così mi da eccezione (InvalidComObjectException) e mi si ferma su myCommand.Dispose()
P.s.: grazie ancora per la pazienza
In primo luogo dovresti fare un'unica query, fatta così:
(le parole che iniziano con la @ sono i placeholder, che il DBMS andrà a sostituire con i dati effettivamente passati tramite parametri)codice:SELECT Username, Password FROM Utenti WHERE Username=@Username AND Password=@Password
e quindi
codice:myCommand.Parameters.AddWithValue("Username", nomeUtente.Text) myCommand.Parameters.AddWithValue("Password", password.Text) Dim result As OleDb.OleDbDataReader result = myCommand.ExecuteReader If result.HasRows Then MsgBox("Login effettuato correttamente") Else MsgBox("Login errato") End If
Amaro C++, il gusto pieno dell'undefined behavior.
Grande! Ora funzionerebbe se dopo
If result.HasRows Then
MsgBox("Login effettuato correttamente")
ci mettessi le istruzioni per aprire un'altra finestra e per chiudere quella di login. Infatti siccome ancora non ce l'ho messe, perchè ancora non ho fatto l'altra finestra, mi da l'eccezione che ti dicevo poco fa. Giusto?
Perfetto!!! Ora che ho fatto l'altra finestra funziona alla perfezione! Grazie mille a tutti, ma soprattuto a MItaly.
Per quanto mi rigurda la discussione può essere chiusa e mi auguro che possa essere di aiuto a molti altri.
Ciao a tutti.