prevención de inyección SQL reemplazando 'con' '[duplicado]

2

Estoy trabajando en una aplicación web que es vulnerable a la inyección de SQL en su cuadro de búsqueda. Utiliza ASP.Net (C #) y Microsoft SQL Server.

En el cuadro de búsqueda, consulta como:

Select Column1 from TBL where Column2 = N'  Here The Search box Content  ';

Como puede ver, el código anterior es completamente vulnerable a SQLi. Lo que hice para mitigar esto fue crear un método para reemplazar todos ' con '' , lo que en SQL Server significa que es una sola cita.

Entonces, si un usuario ingresa algo como ' order by -- en el cuadro de texto, la función de reemplazo lo reemplazará con Replace("'","''"); y el servidor SQL Server nunca ejecutará el SQL inyectado del atacante.

¿Entonces solo quiero saber si estoy completamente seguro contra SQLi? ¿O hay una manera de evitar mi protección de inyección?

    
pregunta ᔕIᑎᗩ KᗩᖇᐯᗩᑎᗪI 06.07.2016 - 14:22
fuente

1 respuesta

1

No, eso no es seguro en absoluto.

Reemplazar comillas simples con comillas dobles o viceversa solo lo mantendrá a salvo de un tipo de inyección. Además, ¿qué sucede si el usuario final tiene una necesidad legítima de ingresar una marca de comillas simples?

Como se señaló en los comentarios, debe usar Declaraciones preparadas .

A continuación se muestra un ejemplo, tomado de Documentación de Microsoft .

Sin embargo, la técnica no es exclusiva de Microsoft. Cada base de datos seria soporta declaraciones preparadas.

SqlCommand command = new SqlCommand(null, connection);

// Create and prepare an SQL statement.
command.CommandText =
    "INSERT INTO Region (RegionID, RegionDescription) " +
    "VALUES (@id, @desc)";
SqlParameter idParam = new SqlParameter("@id", SqlDbType.Int, 0);
SqlParameter descParam = 
        new SqlParameter("@desc", SqlDbType.Text, 100);
idParam.Value = 20;
descParam.Value = "First Region";
command.Parameters.Add(idParam);
command.Parameters.Add(descParam);

// Call Prepare after setting the Commandtext and Parameters.
command.Prepare();
command.ExecuteNonQuery();
    
respondido por el S.L. Barth 06.07.2016 - 14:38
fuente

Lea otras preguntas en las etiquetas