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
Avez-vous essayé de définir le paramètre pour la commande au lieu de passer la valeur directe? –
[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/) –
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.) –