21 votes

Comment empêcher une injection SQL en échappant les chaînes de caractères ?

J'ai quelques requêtes (vers une base de données d'accès) comme ceci :

string comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL='" + user + "' AND PASSWORD_AZIENDA='" + password + "'";

et je voudrais "échapper" à l'utilisateur et au mot de passe, pour éviter une injection.

Comment puis-je le faire avec C# et .NET 3.5 ? Je cherche quelque chose comme mysql_escape_string en PHP...

42voto

Jethro Points 4522

Vous devez utiliser des paramètres. Ce n'est pas nécessaire, mais ce serait préférable.

SqlParameter[] myparm = new SqlParameter[2];
myparm[0] = new SqlParameter("@User",user);
myparm[1] = new SqlParameter("@Pass",password);

string comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL=@User AND PASSWORD_AZIENDA=@Pass";

19voto

Jon Skeet Points 692016

N'échappez pas les chaînes de caractères pour commencer - utilisez une requête paramétrée. Avantages de cette méthode par rapport à l'échappement :

  • Le code est plus facile à lire
  • Vous ne devez pas compter sur le fait que l'échappement soit correct.
  • Il est possible qu'il y ait des améliorations de performance (spécifiques à la base de données, etc.).
  • Il sépare le "code" (le SQL) des données, ce qui est tout simplement logique.
  • Cela signifie que vous n'avez pas à vous soucier des formats de données pour des éléments tels que les chiffres et les dates/heures.

Les documents relatifs à SqlCommand.Parameters donnez un bon exemple complet.

5voto

Serghei Points 2526

Vous devez utiliser les paramètres SQL pour éviter l'injection SQL. regardez le code

//
// The name we are trying to match.
//
string dogName = "Fido";
//
// Use preset string for connection and open it.
//
string connectionString = ConsoleApplication716.Properties.Settings.Default.ConnectionString;
using (SqlConnection connection = new SqlConnection(connectionString))
{
    connection.Open();
    //
    // Description of SQL command:
    // 1. It selects all cells from rows matching the name.
    // 2. It uses LIKE operator because Name is a Text field.
    // 3. @Name must be added as a new SqlParameter.
    //
    using (SqlCommand command = new SqlCommand("SELECT * FROM Dogs1 WHERE Name LIKE @Name", connection))
    {
    //
    // Add new SqlParameter to the command.
    //
    command.Parameters.Add(new SqlParameter("Name", dogName));
    //
    // Read in the SELECT results.
    //
    SqlDataReader reader = command.ExecuteReader();
    while (reader.Read())
    {
        int weight = reader.GetInt32(0);
        string name = reader.GetString(1);
        string breed = reader.GetString(2);
        Console.WriteLine("Weight = {0}, Name = {1}, Breed = {2}", weight,    name, breed);
    }
    }
}

2voto

George Johnston Points 17237

Oui, vous pouvez éviter l'injection en utilisant Named Parameters

1voto

Yuck Points 23174

Utiliser les paramètres au lieu de l'échappement des chaînes de caractères :

var comando = "SELECT * FROM ANAGRAFICA WHERE E_MAIL=@user AND PASSWORD_AZIENDA=@password";

Attribuez ensuite des valeurs à ces paramètres avant d'exécuter l'opération. SqlCommand .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X