2011-11-05 9 views
7

Tengo el hábito de filtrar la variable enviada por el usuario a través de mi función int que asegura que sea un número (si no devuelve 0) y no se cita la variable en consultas de mysql.cotizaciones alrededor de valores int en consultas mysql

¿Es esa una mala práctica? Creo que decidí hacer esto por motivos de rendimiento. Además, siempre he pensado que los números no se deben poner entre comillas.

Ejemplo:

if($perpage != $user['perpage']){ 
if($perpage == 50 || $perpage == 100 || $perpage == 200){ 
$DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]", __FILE__, __LINE__); 
} 
} 
+0

Me interesa saber si gano algo en términos de rendimiento al hacer esto. Obviamente me sentiría mucho más seguro poniéndoles comillas. – domino

+0

Parece que está usando alguna forma antigua de obtener el archivo y la línea del error. No hay necesidad de configurarlo manualmente hoy en día. trigger_error() o debug_backtrace() lo harán por usted –

+0

en cuanto al rendimiento. ¿Experimenta algún problema con esto ahora? –

Respuesta

5

aha! un caso interesante aquí!

  1. Tienes razón en general. Siempre es mejor tratar con números números, no cadenas

    • que hace que el código sea más sano y consistente
    • un entorno strict_mode en MySQL, que no permitirá que haces disimular un número como una cadena, si encendido.
  2. ¡Pero su implementación de hecho permite una inyección! Dejémoslo para su tarea de encontrar :)

Aquí es una referencia para usted, explicando esta inyección: http://php.net/language.types.type-juggling

es así, me gustaría hacer que su código como este

$perpage = intval($perpage); 
if($perpage != $user['perpage'] && in_array($perpage,array(50,100,200) { 
    $DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]"); 
} 
+0

Creo que te perdiste el segundo "si". El valor solo puede ser 50, 100 o 200. No hay espacio para inyecciones. ;) – domino

+0

Primer intento fallido :) –

+0

No lo entiendo. Si algo más que esos tres números pasara a la consulta, entonces sería vulnerable. $ perpage no puede ser otra cosa que un número de todos modos. – domino

2

Mientras los valores de reglaje a través del uso del método intval de PHP antes de usarlos, no veo un problema con él. Podrías hacerte algunos favores en el futuro haciendo eso si alguna vez tienes que interactuar con un DB que piensa que las comillas alrededor de los valores int son un error de sintaxis. (Creo que el servidor MS SQL lo hace).