none
Busqueda interrumpida por constante no valida RRS feed

  • Pregunta

  • Hola 

    estoy trabajando en visual.net 2010 wpf y sql

    al guardar un registro no tengo problemas con un apostrofe incluido en cualquier lugar, pero

    al querer buscar el registro en el boton de busqueda me sale el siguiente error:

    la expresion tiene una constante en la cadena no valida: ' el apostrofe tengo el siguiente 

    codigo que uso con collectionview

     Dim TablaFamilia As DataTable = RefugioTorresDBDataSet.FamiliaDePartes
            Dim cFilas As DataRowCollection = TablaFamilia.Rows
            Dim FilaBuscada() As DataRow
            Dim NL As String = Environment.NewLine
            Dim Criterio As String
            Try
                If CType(FamiliaDePartesViewSource.View, CollectionView).Count > 0 Then
                    Criterio = InputBox("Escriba el Nombre de Familia a Buscar", "Rastreador", FamiliaTextBox.Text)
                    If Criterio <> "" Then
                        Criterio = "Familia Like '*" & Criterio & "*'"
                        FilaBuscada = TablaFamilia.Select(Criterio)
                        If (FilaBuscada.GetUpperBound(0) = -1) Then
                            MessageBox.Show("No se Encontraron Registros Coincidentes", "Rastreador de Datos")
                            Exit Sub
                        End If

    etc

    con cualquier dato cargado en Criterio que no tenga apostrofe si lo busca y lo muestra

    gracias de antemano 

    ojala me puedan ayudar

    lunes, 25 de noviembre de 2013 5:43

Respuestas

  • La solución sencilla consiste en duplicar el apóstrofe:

    Criterio = "familia like '*" & Criterio.Replace("'","''") & "*'"

    Sin embargo, estás haciendo algo que no se debe hacer: estás concatenando en una sentencia de SQL un dato tecleado por el usuario. Esto hace que tu programa sea vulnerable ante ataques de inyección de SQL (imagina lo que pasaría si el usuario teclease un fragmento de sentencia SQL en el criterio de búsqueda: esa sentencia se ejecutaría contra tu base de datos). El remedio consiste en parametrizar la sentencia. Cuando usas un parámetro, el mecanismo de parametrización no sólo elimina la vulnerabilidad de la inyección de código, sino que además se ocupa de los detalles tales como el tema del apóstrofe, los formatos de fecha, los puntos decimales en lugar de comas, etc. No te pongo aquí cómo se parametriza una sentencia en ADO.NET porque se han vertido ríos de tinta sobre el tema; una rápida búsqueda en Internet te proporcionará inmediatamente cientos de artículos que lo explican.

    • Marcado como respuesta Omar Ortiz martes, 26 de noviembre de 2013 19:28
    lunes, 25 de noviembre de 2013 7:17

Todas las respuestas

  • La solución sencilla consiste en duplicar el apóstrofe:

    Criterio = "familia like '*" & Criterio.Replace("'","''") & "*'"

    Sin embargo, estás haciendo algo que no se debe hacer: estás concatenando en una sentencia de SQL un dato tecleado por el usuario. Esto hace que tu programa sea vulnerable ante ataques de inyección de SQL (imagina lo que pasaría si el usuario teclease un fragmento de sentencia SQL en el criterio de búsqueda: esa sentencia se ejecutaría contra tu base de datos). El remedio consiste en parametrizar la sentencia. Cuando usas un parámetro, el mecanismo de parametrización no sólo elimina la vulnerabilidad de la inyección de código, sino que además se ocupa de los detalles tales como el tema del apóstrofe, los formatos de fecha, los puntos decimales en lugar de comas, etc. No te pongo aquí cómo se parametriza una sentencia en ADO.NET porque se han vertido ríos de tinta sobre el tema; una rápida búsqueda en Internet te proporcionará inmediatamente cientos de artículos que lo explican.

    • Marcado como respuesta Omar Ortiz martes, 26 de noviembre de 2013 19:28
    lunes, 25 de noviembre de 2013 7:17
  • Voy a Tratar de evitar que se capture desde el keydown pues..

    aunque no se si en la captura de un codigo al eliminarle el apostrofe pueda ocurrir una

    replica de codigo ya almacenado y luego no se si usando el scaner de codigo como lo puede eliminar

    gracias por tu ayuda..

    hasta luego

    martes, 26 de noviembre de 2013 0:26
  • Gracias por el aporte Alberto.

    Saludos


    <EL CONTENIDO SE PROVEE "COMO ES" SIN GARANTÍA DE NINGÚN TIPO, ASÍ SEA EXPRESA O IMPLÍCITA>
     
    Gracias
     
    MSDN/TechNet Soporte Comunidades
     
    Por favor, recuerde "Marcar como respuesta" las respuestas que hayan resuelto su problema.
    Es una forma común de reconocer a aquellos que han ayudado, y hace que sea más fácil para los otros visitantes encontrar la solución más tarde.

    martes, 26 de noviembre de 2013 19:28
  • Okey

    Saludos

    jueves, 28 de noviembre de 2013 2:46