web-dev-qa-db-fra.com

Comment empêcher une chaîne d'échappement SQL Injection

J'ai quelques questions (à une base de données acccess) comme ceci:

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

et j'aimerais "échapper" à l'utilisateur et au mot de passe pour empêcher une injection.

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

18
markzzz

Vous devez utiliser des paramètres. Eh bien n'ayez pas à le faire mais 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";
38
Jethro

N'échappez pas les chaînes pour commencer - utilisez une requête paramétrée. Avantages de cet échappatoire:

  • Le code est plus facile à lire
  • Vous n'êtes pas obligé de compter sur la bonne évasion
  • Il est possible qu'il y ait des améliorations de performances (spécifiques à la base de données, etc.)
  • Il sépare le "code" (le SQL) des données, ce qui est simplement logique
  • Cela signifie que vous n'avez pas besoin de vous soucier des formats de données tels que les chiffres, les dates et les heures.

Les documents pour SqlCommand.Parameters donnent un bon exemple complet.

18
Jon Skeet

Vous devez utiliser les paramètres SQL pour empêcher 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);
    }
    }
}
5
Serghei

Oui, vous pouvez éviter les injections en utilisant Named Parameters

2
George Johnston

Utilisez des paramètres plutôt que des chaînes d'échappement:

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

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

1
Yuck

Vous pouvez vérifier le lien ci-dessous pour savoir comment empêcher l'injection SQL dans ASP.Net. Je préférerais utiliser

  1. Utilisation de requêtes paramétrées ou de procédures stockées.
  2. Valider des caractères spéciaux comme '(très dangereux)

http://dotnet.dzone.com/news/aspnet-preventing-sql-injectio

1
suryakiran

Si vous pouvez convertir ces paramètres en paramètres nommés, je pense que vous seriez mieux servi. 

0
tjg184

PT: Soyos passos a seguir and resolva to problema de SQL INJECTION

Suivez les étapes ci-dessous et résolvez le problème SQL INJECTION:

ES: Remarques sur les problèmes et les problèmes rencontrés dans la résolution du problème SQL:

OracleParameter[] tmpParans = new OracleParameter[1];

tmpParans[0] = new Oracle.DataAccess.Client.OracleParameter("@User", txtUser.Text);

string tmpQuery = "SELECT COD_USER, PASS FROM TB_USERS WHERE COD_USER = @User";

OracleCommand tmpComand = new OracleCommand(tmpQuery, yourConnection);

tmpComand.Parameters.AddRange(tmpParans);


OracleDataReader tmpResult = tmpComand.ExecuteReader(CommandBehavior.SingleRow);
0
Dominus Farib

@ Jethro

Vous pouvez aussi l'écrire comme ceci:

SqlParameter[] sqlParams = new SqlParameter[] {
    new SqlParameter("@Name", contact.name),
    new SqlParameter("@Number", contact.number),
    new SqlParameter("@PhotoPath", contact.photoPath),
    new SqlParameter("@ID", contact.id)
};
0
Chriz