2009-09-08 9 views
8

Todos sabemos que el SQL parametrizado es el camino a seguir cuando se trata de entrada de usuario y SQL dinámico, pero se convierte de cadena a int (o doble, larga o lo que sea) como ¿efectivo si la entrada que buscas es numérica?Protección de inyección SQL - Transmitir desde cadena a int

Supongo que lo que estoy preguntando es si esta técnica por sí sola es infalible en lo que respecta a la inyección SQL.

Respuesta

10

No soy un experto, pero estoy razonablemente seguro de que esto sería seguro.

¿Pero por qué tomar la oportunidad? Use SQL parametrizado y nunca tendrá que preocuparse por eso.

Además, parametrizar su SQL tiene otras ventajas, no solo la protección de inyección.

1

Es seguro con respecto a la prevención de inyección sql, pero no es una buena idea ya que se obtiene una excepción, que siempre se debe evitar, ya que las excepciones son caras. Deberías desinfectar correctamente la entrada. Y, por supuesto, el usuario aún puede modificar el valor a cualquier rango dentro de un valor int32.

2

Si la cadena era un número válido antes de convertirlo en un entero sí, es seguro. Pero debes asegurarte de que sea un entero válido antes de convertirlo a int.

No sé qué idioma del lado del servidor está utilizando, pero en PHP puede usar la función is_numeric(). Por ejemplo:

$strYouExpectToBeInt = $_POST['id']; 
try { 
    if (false === is_numeric($strYouExpectToBeInt)) { 
     throw new Exception('id is not a numeric string or a number'); 
    } 
    $strYouExpectToBeInt = (int)$strYouExpectToBeInt; 
    if (false === is_int($strYouExpectToBeInt)) { 
     throw new Exception('id is not a valid integer'); 
    } 

    // everything is ok, you can use $strYouExpectToBeInt 
    // in SQL query now 

} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Amigo, ¿por qué usas la constante en la vida izquierda? – arthurprs

1

Probablemente, pero vale la pena probar.

Respecto a la respuesta de Richard, a veces he tenido problemas con IsNumeric() siendo un poco más liberal en lo que aceptará como un número válido que el CAST real a numérico (depende de la configuración de localización, en realidad). Cosas como "-0", "3E-5", "5.000.000" a veces satisfacen IsNumeric, pero no se emiten correctamente. Así que, por lo general, hago una prueba completa, en lugar de eso detecto el enunciado de lanzamiento real.

+0

Sí, es por eso que también uso is_int() después de la conversión para asegurarme. –