2014-09-10 3 views
-5

J'ai dans le DB Sid et mot de passe et il contient Sid = Senan et le mot de passe = pass1234 quand j'entrer dans ce détail dans mon écran de connexion toujours que je reçois ne pas messageboxs'il vous plaît me dire pourquoi cette requête ne fonctionne pas

SqlDataAdapter cmd = new SqlDataAdapter("select Count(*) from [user] where Sid=' " + textBox1.Text + " ' and password='" + textBox2.Text + "'", cnn); 
DataTable dt = new DataTable(); 
cmd.Fill(dt); 
if (dt.Rows[0][0].ToString() == "1") 
    MessageBox.Show("pass"); 
else 
    MessageBox.Show("fail"); 
+6

avez-vous essayé de parcourir votre code pour voir quelles valeurs sont transmises? – jbutler483

+0

Sur une note de côté - vous devez vraiment corriger cette terrible vulnérabilité d'injection SQL. – Cylindric

+0

@steve Voilà une réponse, pourquoi ne pas l'afficher en tant que tel? – Cylindric

Répondre

0

L'erreur provient d'une simple faute de frappe. Vous avez ajouté des espaces à la valeur transmise pour la condition Sid.
Toutefois, votre requête doit être réécrite de cette manière

string cmdText = "select Count(*) from [user] where [email protected] and [email protected]"; 
SqlCommand cmd = new SqlCommand(cmdText, cnn) 
cmd.Parameters.AddWithValue("@sid", textBox1.Text); 
cmd.Parameters.AddWithValue("@pwd", textBox2.Text); 
int count = Convert.ToInt32(cmd.ExecuteScalar()); 
if (count > 0) 
    MessageBox.Show("pass"); 
else 
    MessageBox.Show("fail"); 

Cette approche utilise une requête paramétrées pour éviter Sql Injection, et utilise directement un SqlCommand sans construire le SqlDataAdapter et DataTable. Le SqlCommand.ExecuteScalar est la méthode correcte à utiliser lorsque vous devez récupérer simplement la première colonne d'une seule ligne ou appeler une fonction T-SQL scalaire comme COUNT()

En note, gardez à l'esprit que le stockage des mots de passe en texte clair dans votre base de données est un gros problème de sécurité. Celui qui a accès à la base de données sera capable de lire les mots de passe de chaque utilisateur. Les mots de passe doivent être stored as a computed hash et vérifiés en répétant l'algorithme de hachage sur les données entrées par l'utilisateur.

+0

merci ça marche maintenant –

+0

Content de vous aider. En tant que nouvel utilisateur, je souhaite vous suggérer [cette lecture sur comment accepter des réponses utiles] (http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work). – Steve

+1

je vous remercie pour toutes ces informations je vais lire comment utiliser le hachage pour protéger mes mots de passe. –

Questions connexes