Administrar comillas utilizando el método Replace de la clase String

El título hace referencia a un artículo -bastante preocupante por cierto- publicado en el sitio web de El Guille, en el que se presenta una función para evitar el problema con las comillas simples cuando se concatenan sentencias SQL.

En este ejemplo veremos cómo utilizar el método Replace de la clase String. Este ejemplo reemplaza comillas simples entre dos comillas simples adyacentes para asegurarse de que los datos tienen el formato correcto cuando se concatenan valores para una instrucción SQL.

El código que se muestra es el siguiente (en mi opinión, código candidato para WTF):

csharp:
public string QuitarApostrofe(string vCadena)
{
    vCadena = vCadena.Replace("'", "''");
    return vCadena;
}

public void e50factu()
{
    //Cadena a la cual se le va a sustituir la comilla.
    string MiCadena = QuitarApostrofe("WARNER'S DE MEXICO SA DE CV ");
    //Abro la conexion
    ConecServer.Open();
    OleDbCommand mycmd = ConecServer.CreateCommand();
    OleDbTransaction Trans;
    Trans = ConecServer.BeginTransaction(IsolationLevel.ReadCommitted);
    mycmd.Connection = ConecServer;
    mycmd.Transaction = Trans;
    try
    {
        strSQL = "INSERT INTO e50factu(serie50,numero50,descri50) " +
            "VALUES ('" + clsVariables.vSerie + "'," + 20356 + ",'" + MiCadena + "')";
        mycmd.CommandText = strSQL;
        mycmd.ExecuteNonQuery();
        strSQL = "INSERT INTO A50COTI(folio,factura,usuario,hora,serie)" +
            "VALUES(" + 1 + "," + 20356 + "," + "evallejo" + ",'" + "12:00" + "','" + "B" + "')";
        mycmd.CommandText = strSQL;
        mycmd.ExecuteNonQuery();
        Trans.Commit();
    }
    catch (System.Exception error)
    {
        try
        {
            Trans.Rollback();
            MessageBox.Show("Ocurrio un error, no se realizo ningún cambio en la base de datos" +
                error.Message,
                "Guardar Factura", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
        catch (OleDbException ex)
        {
            if (Trans.Connection != null)
            {
                MessageBox.Show("Ha ocurrido una excepción grave de tipo " + ex.GetType());
            }
        }
    }
    finally
    {
        ConecServer.Close();
    }
}

Personalmente creo que el hecho de que se publiquen o dejen pasar este tipo de recursos en un sitio bastante popular, puede hacer daño a aquellos que recién empiezan y consideran que todo lo que se publica ahí sea información útil y fiable.

11 Replies to “Administrar comillas utilizando el método Replace de la clase String”

  1. Bien... veo que no fui el único que le dio un bajón de tensón al ver ese "bonito y maravilloso" código.

  2. el problema ahora es que mucha gente tomará como referencia ese artículo, y harán las cosas mal hasta que tengan problemas y deban cambiarlo...

  3. Efectivamente DN, es realmente lamentable ver que este tipo de artículos salgan así nada más. A diferencia de los blogs, donde el autor seguramente saldría lapidado -al igual que yo algunas veces 😀 , en este tipo de sitios que no hay una forma sencilla de poner comentarios o hacer que el autor corrija su artículo.

  4. Lo peor... es que ese artículo lo hizo una persona y se lo envió a Guille para publicarlo... y Guille supuestamente tiene bastantes años de experiencia, y tuvo problemas con sql injection y todo... y aún así... va y lo publica sin más.

  5. Y si no es mucho pedir, ¿podrían indicar porqué ese código está mal? porque yo lo que veo no me parece incorrecto...

  6. Jmaldonado, ese justamente es un problema, que los que vean ese código no encuentren nada de malo y les parezca que todo está bien...

    Una de las tantas barbaridades presentes en esa pequeña porción de código, es el uso de la función QuitarApostrofe, que supuestamente fue hecha para evitar problemas con los ', pero al parecer el autor no está muy enterado sobre temas de seguridad -no sé porque tuvo que recurrir a ese tipo de cosas, si en .NET se pueden hacer consultas parametrizadas.

    Hay más errores en el manejo de excepciones, te dejo como tarea 🙂 los detalles de esa afirmación

    Saludos

  7. Bueno, para empezar no entiendo porque usa una instrucción SQL en una clase cuando se deberían utilizar stored procedures, pero si coincido en la idea de tener mas cuidado en el código que se publica.

    Esa es una ventaja si se dan cuenta entre un site y un blog, como dice alex, si fuese en un blog ya lo habrían lapidado.

    Saludos.

  8. Hola, es la primera vez que entro en esta web, y he llegado a este sitio despues de escribir en google, "sustituir comillas simples en sql". Voy a comentar mi punto de vista respecto a los comentarios que hay de este codigo. El caso, (mi caso) es que utilizo consultas parametrizadas, stored procedures, y evidentemente, no me hace falta sustituir las comillas, pero en el caso de hacer select en un datatable, existe alguna manera de pasarle parametros? os escribo el codigo que tengo:
    drm = ds.FOTOS.Select("CARP LIKE '" & model & "'")
    Si la variable model contiene una apostrofe, se produce una excepcion. Aqui, entiendo que si que me hace falta sustituir la comilla simple. Espero comentarios.

  9. Hola David, en este caso el método Select del DataTable no soporta parámetros, así que la única alternativa que tienes es reemplazar cada comilla por dos comillas simples.

  10. Ok. Gracias por responder. Me quedo mas satisfecho. Seguiere visitando este sitio.Saludos.

Comments are closed.