2012-02-24 26 views
12

¿Cuál es la forma más segura de generar consultas SQL en C#, incluida la limpieza de la entrada del usuario para que esté a salvo de la inyección? Estoy buscando utilizar una solución simple que no necesite bibliotecas externas.Generar consultas SQL de forma segura en C#

+1

aproximadamente 1 archivo "bibliotecas externas" podría hacer eso muy simple, como Dapper o PetaPoco – Guillaume86

Respuesta

17

Parámetros utilizar SQL:

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlparameter(v=vs.80).aspx

He aquí un ejemplo en C#

SqlCommand tCommand = new SqlCommand(); 
tCommand.Connection = new SqlConnection("YourConnectionString"); 
tCommand.CommandText = "UPDATE players SET name = @name, score = @score, active = @active WHERE jerseyNum = @jerseyNum"; 

tCommand.Parameters.Add(new SqlParameter("@name", System.Data.SqlDbType.VarChar).Value = "Smith, Steve"); 
tCommand.Parameters.Add(new SqlParameter("@score", System.Data.SqlDbType.Int).Value = "42"); 
tCommand.Parameters.Add(new SqlParameter("@active", System.Data.SqlDbType.Bit).Value = true); 
tCommand.Parameters.Add(new SqlParameter("@jerseyNum", System.Data.SqlDbType.Int).Value = "99"); 

tCommand.ExecuteNonQuery(); 
+0

Los parámetros SQL son una excelente manera de comenzar. Si la aplicación comienza a crecer y necesita realizar muchas llamadas SQL, probablemente sea hora de mirar LINQ o un ORM de algún tipo. – NickHeidke

+0

Apruebo (y uso mucho personal LINQ-to-SQL), pero realmente no lo considero una solución simple (hay que entender la filosofía de DataContext para evitar algunos errores), pero como dije en los comentarios, hay algunos pequeños ayudantes para construir consultas parametrizadas que usaría en lugar de usar directamente las clases SqlClient. – Guillaume86

+0

Este es amigo de la vieja escuela – Dilberted

0

Usando DBML y LINQ para manejarlo por usted. Muchas personas han trabajado para garantizar que esos problemas se mitiguen.

Y si no es así, al menos parametrice sus consultas.

1

La primera regla de oro es para asegurarse de que utiliza consultas/comandos parametrizados. Básicamente, no compile dinámicamente una cadena sql que incluya algo que el usuario haya ingresado en la página.

Si utiliza en ORM (EF, L2S, Nhib), esto generalmente se maneja en la mayoría de los casos porque la mayoría de ellos ejecuta consultas parametrizadas.

+0

Nunca baje el camino de nhib demasiada configuración para hacer. – Dilberted

+0

@Dilberted: uso NHib mucho. Es un poco difícil comenzar, pero realmente vale la pena durante la vida de una gran aplicación. Es un producto mejor que EF/L2S para proyectos más complejos. – swannee

1

Parametrice sus consultas.

En caso si usted construye algunos TSQL que construye alguna otra TSQL dinámico - then use some described technique

¿Qué significa "parametrización significa

Sede, no usar algo como esto:

sqlCommand.CommandText = "select * from mytable where id = "+someVariable; 

uso esto? :

sqlCommand.CommandText = "select * from mytable where id = @id"; 
sqlCommand.Parameters.AddWithValue("@id", someVariable); 
+0

¿Qué significa esto exactamente? –

+0

Respuesta actualizada. –

+0

Gracias, Oleg –

0

Un nombre propio para DBML es linq2sql o una versión avanzada se llama marco de entidad. Estas tecnologías son provistas por Microsoft y bien integradas con Visual Studio. No requiere bibliotecas adicionales.

productos

Bastante estables ..

+0

La solución más simple es linq2sql .. No se escriben consultas SQL – Dilberted

+0

¿Más simple? Me gusta esto. de usr en dc.Los usuarios se unen a ug in dc.UserGroups en usr.UserID es igual a ug.UserID join gr en dc.Group en ug.GroupID es igual a gr.PkID select new {usr, gr} –

1

Hacer uso de parametrizadas consultas.

Ejemplo simple.

var sql = "SELECT * FROM MyTable WHERE MyColumn = @Param1"; 
using (var connection = new SqlConnection("...")) 
using (var command = new SqlCommand(sql, connection)) 
{ 
    command.Parameters.AddWithValue("@Param1", param1Value); 
    return command.ExecuteReader(); 
} 

Ejemplo más detallado.

protected void btnGoodAddShipper_Click(object sender, EventArgs e) 
{ 
    string connStr = c 
     "Server=(local);Database=Northwind;Integrated Security=SSPI"; 

    // this is good because all input becomes a 
    // parameter and not part of the SQL statement 
    string cmdStr = 
     "insert into Shippers (CompanyName, Phone) values (" + 
     "@CompanyName, @Phone)"; 

    using (SqlConnection conn = new SqlConnection(connStr)) 
     using (SqlCommand cmd = new SqlCommand(cmdStr, conn)) 
     { 
      // add parameters 
      cmd.Parameters.AddWithValue 
       ("@CompanyName", txtCompanyName.Text); 
      cmd.Parameters.AddWithValue("@Phone", txtPhone.Text); 

      conn.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
} 
3

En esencia no hacen esto

SqlCommand command = new SqlCommand(MyConnection); 
command.CommandText = "Select * From MyTable Where MyColumn = '" + TextBox1.Text + "'" 
... 

hacer

SqlCommand command = new SqlCommand(MyConnection); 
command.CommandText = "Select * From MyTable Where MyColumn = @MyValue"; 
command.Parameters.AddWithValue("MyValue",TextBox1.Text); 
... 

Básicamente no construir su comando SQL directamente desde la entrada del usuario.

Si usa un ORM, como EntityFrameworks/POCO, todas las consultas se realizan en el último formulario.

Cuestiones relacionadas