Cómo evitar que una inyección SQL escape cadenas

Tengo algunas consultas (a una base de datos de acceso) como esta:

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

y me gustaría “escapar” del usuario y la contraseña, evitando una inyección.

¿Cómo puedo hacerlo con C # y .NET 3.5? Estoy buscando cosas como mysql_escape_string en PHP …

Necesitas usar parámetros. Bueno, no es necesario, pero sería preferible.

 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"; 

No escapes de las cadenas para empezar: utiliza una consulta parametrizada. Beneficios de esto sobre el escape:

  • El código es más fácil de leer
  • No tiene que depender de obtener el escape correcto
  • Es posible que haya mejoras de rendimiento (DB-specific, etc.)
  • Separa el “código” (el SQL) de los datos, lo cual es lógicamente lógico
  • Significa que no necesita preocuparse por los formatos de datos para cosas como números y fechas / horas.

Los documentos para SqlCommand.Parameters dan un buen ejemplo completo.

Debe usar los parámetros de SQL para evitar que la inyección de SQL vea el código

 // // 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); } } } 

Sí, puede evitar la inyección mediante el uso de Named Parameters

Use parámetros en lugar de escaparse de cadenas:

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

Luego, asigne valores a esos parámetros antes de ejecutar SqlCommand .

Puede consultar el siguiente enlace para saber cómo evitar la inyección de SQL en ASP.Net. Yo preferiría usar

  1. Uso de consultas parametrizadas o procedimientos almacenados.
  2. Validar caracteres especiales como ‘(muy peligroso)

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

Si puede convertir estos a Parámetros con nombre, creo que estaría mejor servido.

@Jethro

También podrías escribirlo así:

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

PT: Siga os pases a seguir y resolva o problem de SQL INJECTION

ES: Siga los pasos a continuación y resuelva el problema de SQL INJECTION:

ES: Siga los siguientes pasos y resuelva el problema de la inyección de 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);