2012-01-22 43 views
6

Tengo una página (index.php) que toma una variable GET de la URL y la comprueba por motivos de seguridad. Esta variable GET solo debe ser un número entero. Estoy usando el siguiente código para verificar esto, pero en todos los casos, entero o no, obtengo la página index.php. El encabezado nunca aparece. Después de este código, el resto de la página aparece comenzando con la etiqueta html.PHP is_int no funciona como se esperaba

PHP:

<?php ob_start(); session_start(); 
$q=trim($_GET['q']); 
if (!is_numeric($q)){ 
header("HTTP/1.0 404 Not Found"); 
} 
?> 
+1

No sé si ya lo sabe, pero debería agregar un 'exit();' después del 'encabezado (..)'. De lo contrario, el script continuará imprimiendo el contenido de la página. – laher

+0

Leer [la documentación] (http://php.net/manual/en/function.is-int.php) le mostrará que 'is_int()' verifica el tipo de la variable, por lo que la cadena con "' 123 '" into 'is_int()' no devolverá 'true', ya que es una cadena. ¿Por qué etiquetó su publicación con 'http-status-code-404'? – Tadeck

+0

etiqueta @Tadeck eliminada. gracias por esa documentación. Ahora estoy usando is_numeric y todavía no está funcionando – kirby

Respuesta

19

No va a ser un número entero si es aprobada en una cadena de consulta.

Trate is_numeric()

+1

También 'ctype_digit()' para una cadena que consta solo de números. – mrlee

+0

@alien He actualizado mi código actual y tengo el mismo comportamiento que antes: [ – kirby

+0

Intente cambiar 'ob_start;' a 'ob_start();' – AlienWebguy

5

Hay una mejor manera de hacer esto, que está lanzando a int:

$q = (int) $_GET['q']; 

El is_int es comportarse como se esperaba. Porque los argumentos GET siempre son cadenas. Intenta var_dumping them.

+1

Ahora que lo pienso, la respuesta de AlienWebguy es probablemente mejor ya que podrás filtrar cualquier valor 'extraño' ... – Joep

0

A veces desea validar la entrada que debe ser el número, pero en $_GET o $_POST lo obtendrá como una cadena. is_numeric() puede ser problemático, ya que permite a hexadecimal, binario y octal (de manual):

Thus +0123.45e6 is a valid numeric value. Hexadecimal (e.g. 0xf4c3b00c), Binary (e.g. 0b10100111001), Octal (e.g. 0777) notation is allowed too but only without sign, decimal and exponential part.

No puede utilizar is_int() ya que es sólo para valores enteros así que ... (no cadena!) puede validar números que son de cadena entera y de esa manera: función

function is_int_val($value){ 
    return (string) $value === (string) ((integer) $value); 
} 

is_int_val('33'); // true 
is_int_val('33a'); // false 
is_int_val('033'); // false 

también es posible anular is_int(), utilizando override_function() pero todavía puede ser útil en versión original.

Cuestiones relacionadas