2017-05-09 4 views
0

J'ai un problème lorsque je lance une commande SQL et le résultat est un mot de passe haché sha 256C# Duplicate '' avec SQL Server 2008

mot de passe dans la base de données: "Z?VU??u2???f?[??\n?Mn??=1???<3?\v?"

Mot de passe retourné par C# après la requête: "Z?VU??u2???f?[??\ \n?Mn??=1???<3?\ \v?" (je mets un espace parce qu'elle est supprimée par la page)

Ceci est mon code:

byte[] data = System.Text.Encoding.ASCII.GetBytes(txtPassword.Text); 
data = new System.Security.Cryptography.SHA256Managed().ComputeHash(data); 

String hash = System.Text.Encoding.ASCII.GetString(data); 

SqlDataAdapter da = new SqlDataAdapter(); 

string Command = "Select * From Users where Status=1 and Username='" + txtUser.Text + "'" + " and Password='" + hash + "'"; 
da.SelectCommand = new SqlCommand(Command, Database.Connection); 

da.Fill(dsResult); 

if (dsResult.Tables[0].Rows.Count != 0) 
{ 
    DoSomething(); 
} 

j'ai vu l'erreur lorsque je tente cette

Select Password 
From Users 
Where Status = 1 
    And Username = '" + txtUser.Text + "'" 

et le résultat a été le mot de passe, mais avec double \.

Dans SQL Server Management Studio, cette requête:

Select * 
From Users 
Where Status = 1 
    And Username = 'Rick' 
    And Password = 'Z?VU??u2???f?[??\n?Mn??=1???<3?\v?' 

fonctionne parfaitement.

Merci.

Édition: Modifications d'injection.

Code:

   SqlDataReader da; 
       string Command= @"Select * From Users where Status=1 and [email protected] and [email protected]"; 
       SqlCommand cmd = new SqlCommand(Command, Database.Connection); 
       cmd.Parameters.Add("@Password", SqlDbType.NVarChar).Value = "Z?VU??u2???f?[??\n?Mn??=1???<3?\v?"; 
       cmd.Parameters.Add("@User", SqlDbType.NVarChar).Value = txtUsuario.Text.Replace(" ", ""); 
       da = cmd.ExecuteReader(); 
       if (da.HasRows) 
       { 
        da.Read(); 
        DoSomething(); 
       } 

Mais le problème persiste. Lorsque C# exécute la requête interprète que le mot de passe dans la base de données a la double barre oblique il ne correspond jamais avec le mot de passe d'entrée

+0

Avez-vous essayé de définir le paramètre pour la commande au lieu de passer la valeur directe? –

+2

[Alerte SQL Injection] (http://msdn.microsoft.com/fr-fr/library/ms161953%28v=sql.105%29.aspx) - vous ne devez pas ** concaténer ensemble vos instructions SQL - utiliser ** requêtes paramétrées ** au lieu d'éviter l'injection SQL - consultez [Little Bobby Tables] (https://xkcd.com/327/) –

+1

La duplication des antislashs est un comportement ** standard C# ** - ce n'est pas inhabituel ou cause préoccupation. La barre oblique inverse est dupliquée pour indiquer que vous voulez vraiment une barre oblique inverse - sinon, elle sera interprétée comme une ** séquence d'échappement ** (avec le caractère suivant, par exemple '\ t' est' ',' \ r' est retour de chariot etc.) –

Répondre

1

En utilisant SqlParameter vous pouvez envoyer variable sans perte de données et d'éviter SQL Injection comme ceci:

string insertString = @"Select * From Users where Status=1 and Username='Rick' and [email protected]"; 
SqlCeCommand cmd = new SqlCeCommand(insertString, c); 
cmd.Parameters.Add("@pass", SqlDbType.NVarchar).Value = "Z?VU??u2???f?[??\n?Mn??=1???<3?\v?"; 
//And the rest 
+0

Merci de m'avoir informé de l'injection. Je fais quelques changements mais le problème persiste. Lorsque C# exécute la requête interprète que le mot de passe dans la base de données a la double barre oblique, il ne correspond jamais au mot de passe entré – NachoRuba