2011-01-25 28 views
13

Recientemente me dijeron que hay FILTER_VALIDATE_INT, que por cierto es genial.PHP Security - (int) vs FILTER_VALIDATE_INT

Mi pregunta es en términos de tomar un valor entero del sitio web ya sea desde el usuario o generado desde la aplicación web, y pasado a través de la cadena de consulta.

El valor (entero) se puede mostrar o usar en la consulta de mysql.

Estoy tratando de estructurar el mejor método de seguridad posible para esto.

Con esto en mente, es seguro utilizar simplemente

$myNum = (int)$_GET['num']; 

O

if (filter_var($_GET['num'], FILTER_VALIDATE_INT)) $myNum = $_GET['num']; 

Además, explique cuál es la diferencia entre usar (int) y FILTER_VALIDATE_INT

+0

Para expandir las respuestas existentes, 'FILTER_SANITIZE_NUMBER_INT' es equivalente a la conversión' (int) '. – mario

+3

@mario, ¿cómo puedes decir eso? No lo es. –

Respuesta

27

La diferencia es que un elenco al int siempre obtendrá un int, que puede ser o no el original valor. P.ej. (int)'foobar' resultados en el int0. Esto lo hace seguro para la mayoría de los propósitos de SQL, pero no tiene nada que ver con el valor original, y ni siquiera lo sabrá.

filter_var con FILTER_VALIDATE_INT dice que si el valor es un int, en base al cual se puede tomar la decisión de utilizarlo en una consulta SQL o mostrar un mensaje de error al usuario.

+0

@deceze ¿por casualidad sabría si hay mucha diferencia entre 'filter_var' y su contraparte' is_int'? –

+2

@Russell Dias: resultados para ''42 '' al menos (entero representado como cadena). – zerkms

+0

@zerkms Oops no se dio cuenta de que también prueba una cadena numérica. Gracias por el ejemplo;) –

0
<input type="text" name="param"></input> 


$price = filter_input(INPUT_POST, 'param', FILTER_VALIDATE_INT); 
if ($price !== false) { 
print " a number."; //works when value is number 
} 


if(is_int($_POST['param'])){ 
    print "is number."; //don't works when value is number 
} 

Por favor, intente con cuando valor es número.