He área de texto en mi página. En esa zona tengo que añadir algo de código HTML y guardarlo en la base de datos. Y funciona para html simple, pero cuando voy a seleccionar un texto de «wikipedia», por ejemplo y pegar y tratar de salvar cuando la Consulta SQL a ejecutar, tengo excepción con el siguiente error:

Incorrect syntax near 's'.
The identifier that starts with '. Interestingly, old maps show the name as&nbsp;<em>Krakow</em>.</p>
<p>Kragujevac experienced a lot of historical turbulence, ' is too long. Maximum length is 128.
The identifier that starts with '>Paleolithic</a>&nbsp;era. Kragujevac was first mentioned in the medieval period as related to the public square built in a sett' is too long. Maximum length is 128.
The label 'http' has already been declared. Label names must be unique within a query batch or stored procedure.
The label 'http' has already been declared. Label names must be unique within a query batch or stored procedure.
Unclosed quotation mark after the character string '>Belgrade Pashaluk</a>.</p>'

Estoy usando asp mvc de afeitar y motor. Yo no sé que tal vez necesito encome html de alguna manera. También he añadido esto para ArticleText propiedad:

[AllowHtml]        
        public string ArticleText { get; set; }

Este es el código para guardar en base de datos:

string sql = @"insert into tbl_articles 
                               (Text) values 
                               ("'" + article.ArticleText"'"+")";

                SqlCommand cmd = new SqlCommand(sql, conn);

                cmd.ExecuteNonQuery();
  • El problema es que su ArticleText contiene comillas simples (también conocido como apóstrofes) que tendría que ser escapado. ¿Por qué construir SQL dinámico en lugar de usar una consulta parametrizada?
  • Hacer un proc que hace exactamente lo que usted tiene en su cadena y pasar el HTML como un parámetro… como por arte de magia.
InformationsquelleAutor 1110 | 2011-10-13

5 Comentarios

  1. 30

    Wow, NO, NO, NO. Su código es vulnerable a inyección SQL y muy malo va a pasar si no hace uso de las consultas parametrizadas. A fin de utilizar las consultas parametrizadas.

    using (var conn = new SqlConnection("some conn string"))
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        cmd.CommandText = "insert into tbl_articles (Text) values (@Text)";
        cmd.Parameters.AddWithValue("@Text", article.ArticleText);
        cmd.ExecuteNonQuery();
    }

    Cada vez que uso el + operador para concatenar cadenas al crear una consulta SQL que usted está haciendo algo extremadamente peligroso y equivocado.

    • +1 a mi también los pensamientos – se va a forjar el camino, pero como siempre…
    • precisamente, por eso los pongo en using declaración.
    • yeesh estoy ciego o estúpido, o ambos.
    • Gracias. Yo siempre uso las consultas parametrizadas, pero yo estaba construcción rápida de la prueba y el uso de esta forma de construir la consulta. Así que pensé que el problema estaba en otro lugar. Muchas gracias 🙂
    • y una cosa más aquí, parametrizadas consulta salva de la inyección de SQL, pero no de XSS, por lo que el uso de la biblioteca AntiXSS, y desinfectar la entrada antes de guardarlo. Soy serio, hazlo ! 🙂
    • hey @DarinDimitrov podemos mismo procedimiento se sigue en el procedimiento almacenado?

  2. 2

    Intentar salvar de esta manera:

    string sqlQuery = "INSERT INTO tbl_articles (Text) VALUES (@text)";
    SqlCommand cmd = new SqlCommand(sqlQuery, db.Connection);
    cmd.Parameters.Add("@text", article.ArticleText);
    cmd.ExecuteNonQuery();
  3. 1

    Tratar:

    string sql = @"insert into tbl_articles 
                                   (Text) values 
                                   (@articleText)";
    
                    SqlCommand cmd = new SqlCommand(sql, conn);
                    cmd.Parameters.AddWithValue("@articleText",
                    Server.HtmlEncode(article.articleText));
    
                    cmd.ExecuteNonQuery();
    • ¿Por qué HtmlEncode en la base de datos? Creo que te gustaría hacer que salir, no va en.
    • Usted necesita para DECODIFICAR cuando se va fuera.
    • …por lo que quiere HTMLEncode el texto que va en la base de datos, entonces HtmlDecode el texto que viene de la base de datos? Citar erróneamente a una famosa película, «no creo que significa lo que usted piensa que significa.» Usted necesita simplemente para escapar del texto para que se guarda correctamente y de forma segura en la base de datos, no HtmlEncode ella; del mismo modo, como ya es HTML, usted probablemente no quiere decodificar cuando se tira de la base de datos.
  4. 1

    Este es un ejemplo clásico de la apertura de su sistema para un Ataque de inyección de Sql.

    Usted necesita para escapar de la ' carácter porque si el Html contiene el ' carácter, se rompe la Instrucción SQL cuando se ejecuta.

    EDITAR: Usar Darins solución para resolver el problema.

    • Lo que usted necesita hacer mucho más para proteger su sistema
    • la comisión de servicio. los apóstrofes son sólo la punta del iceburg.
    • Yo especie de relieve la razón para el error en la mano, la solución, sin embargo, es como usted dice más que tomar el cuidado de la '
  5. 1

    este debe ser parametrizado:

        public void foo(string connectionString, string textToSave)
        {
            var cmdString = "insert into tbl_articles (text) values (@text)";
            using (SqlConnection conn = new SqlConnection(connectionString))
            {
                using (SqlCommand comm = new SqlCommand(cmdString, conn))
                {
                    comm.Parameters.Add("@text", SqlDbType.VarChar, -1).Value = textToSave;
                    comm.ExecuteNonQuery();
                }
            }
        }

    (este es el gereral idea, no es completamente funcional como por escrito.)

Dejar respuesta

Please enter your comment!
Please enter your name here