Aquí está mi código:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
Siempre entra dentro del caso.
Aquí está mi código:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
Siempre entra dentro del caso.
is_int
comprueba que el tipo de datos es un entero, pero todo en $_GET
será una cadena . Por lo tanto, siempre devolverá false
.
En caso de necesidad, se puede echar a un entero y para verificar si! = 0.
$id = isset($_GET['id']) ? (int) $_GET['id'] : null;
if (!$id) { // === 0 || === null
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
Pero una solución más robusta podría implicar algún tipo de cadena de entrada de validación/filtrado, como PHP incorporado en filter_input_array()
.
(post Editado el Oct/13 ya que todavía está recibiendo upvotes y fue redactado modo algo confuso.) De entrada
Se agotó el número de votos por día del día, pero esta respuesta en realidad dice la razón por la cual se usa is_numeric.Cualquier parámetro de solicitud HTTP enviado por POST o GET siempre será una cadena. –
+1 - aunque debe mencionarse, 'is_numeric' no tiene el mismo efecto, como p. Ej. también deja pasar los valores hexadecimales además de otros (vea php.net) – Helmut
@Helmut, sí, 'is_numeric()' no es apropiado para verificar los ID enteros. En la práctica, toda la entrada del usuario se debe pasar a través de 'filter_var()' o alguna otra rutina similarmente explícita. – Matthew
usuario en array $ _GET (así como los demás superglobals) todos toman la forma de cuerdas.
is_int
comprueba el tipo (es decir string
) del valor, no si contiene valores enteros-similares. Para la verificación de que la entrada es una cadena entera, sugeriría algo como ctype_digit
o un número entero filter (FILTER_VALIDATE_INT
). Esto tiene la ventaja de realmente cambiar el valor a tipo entero. Por supuesto, también podría encasillarlo con (int)
.
De la documentación de PHP para is_int:
Nota: Para probar si una variable es un número o una cadena numérica (como formulario de entrada, que siempre es una cadena), debe utilizar is_numeric().
Cualquier entrada de usuario entra como una cadena, porque PHP no tiene forma de decir qué tipo de datos espera que sean los datos.
Llénelo en un número entero o use una expresión regular si desea asegurarse de que se trata de un número entero.
<?php
$id = $_GET["id"];
if ((int) $id == 0) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
Trate de usar en lugar de is_numeric
is_int
. is_numeric
comprueba si se le da algo que puede ser un número ($_GET
devuelve cadenas, creo). is_int
comprueba si la variable es de tipo int
Uso is_numeric() para evaluar el contenido y is_int() para evaluar el tipo.
O bien, podría utilizar una coincidencia de expresiones regulares para comprobar si la cadena es un número entero.
if(preg_match('/^\d+$/',$_GET['id'])) {
// is an integer
}
Y '$ _GET' en realidad contiene ... ¿qué? –
números del 1 al infinito. – ilhan