Si emitimos un valor, ¿es necesario escapar con mysqli_real_escape_string ()?

3

real_escape() es una función que necesita memoria para su funcionalidad, por lo que me preguntaba si habría alguna necesidad de hacerlo si ya lo hemos lanzado.

$num = (int) $num;

¿Podemos usar real_escape() solo para los parámetros de cadena?

    
pregunta ALH 15.04.2012 - 07:57
fuente

3 respuestas

7

Es cierto que la conversión puede mitigar las inyecciones de SQL, pero a menos que el rendimiento sea una preocupación enorme para usted, usaría mysqli_real_escape_string() de todas formas, por dos razones:

  1. Su aplicación podría cambiar en el futuro. Incluso si su aplicación solo está pasando enteros a sus consultas en este momento (a través de esta llamada de función particular o lo que sea), su código puede modificarse el futuro para aceptar cadenas, etc. Propongo que es mejor que planee con anticipación un poco, y que debería eliminar esta potencial vulnerabilidad de seguridad futura ahora, mientras esté en su mente.

  2. Un desarrollador con menos experiencia podría "refactorizar" a ese reparto. Puedo ver a un desarrollador junior que ingresa tu código en algún momento y dice: "¿Por qué está este reparto aquí? de todos modos, solo se pasan las ID al SQL ", y luego se refactoriza esa conversión. Recomiendo usar mysqli_real_escape_string() aunque solo sea para informar a los futuros desarrolladores que hay un problema de seguridad en juego aquí.

Por lo menos, si vas a confiar en un elenco para implementar la seguridad, dejaría algunos comentarios muy sensatos de ALL CAPS en tu código para dejar en claro que eso es lo que estás haciendo.

    
respondido por el Chris Allen Lane 15.04.2012 - 19:29
fuente
3

Tienes razón. Si sabe que es un int (porque lo ha convertido en int ), no necesita llamar a mysql_real_escape_string() .

P.S. Voy a arriesgarme y expresar una opinión. Para la mayoría de los propósitos, las declaraciones preparadas son una mejor defensa contra la inyección de SQL que la aplicación manual de funciones de escape. (Estoy seguro de que hay gente de PHP en algún lugar que me hará pasar un mal rato al respecto, o señalará que algunos sistemas de bases de datos en PHP no admiten declaraciones preparadas).

    
respondido por el D.W. 15.04.2012 - 08:19
fuente
0

En este ejemplo, si lanza una variable, no hay necesidad de realizar ningún otro saneamiento. Pero recuerda que el casting debe estar preparado en el nivel de PHP. ¡Ni siquiera pienses en lanzar en tu consulta SQL!

Correcto:

    mysql_query("SELECT * FROM users WHERE id=".(int)$_GET['id']) 

Este conduce a la inyección de SQL ciego:

    mysql_query("SELECT * FROM users WHERE id=CAST(".$_GET['id']." AS UNSIGNED)")
  
    

? id = 1 ASIGNADO) y 1337 = BENCHMARK (13371337, MD5 ('ouch!')) -

  
    
respondido por el p____h 06.06.2012 - 11:22
fuente

Lea otras preguntas en las etiquetas