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 ...
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";
N'échappez pas les chaînes pour commencer - utilisez une requête paramétrée. Avantages de cet échappatoire:
Les documents pour SqlCommand.Parameters
donnent un bon exemple complet.
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);
}
}
}
Oui, vous pouvez éviter les injections en utilisant Named Parameters
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
.
Vous pouvez vérifier le lien ci-dessous pour savoir comment empêcher l'injection SQL dans ASP.Net. Je préférerais utiliser
Si vous pouvez convertir ces paramètres en paramètres nommés, je pense que vous seriez mieux servi.
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);
@ 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)
};