Ecco il mio codice:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
Si entra sempre all'interno del caso.
Ecco il mio codice:
<?php
$id = $_GET["id"];
if (is_int($id) === FALSE) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
Si entra sempre all'interno del caso.
is_int
controlla che il tipo di dati è un numero intero, ma tutto in $_GET
sarà una stringa . Pertanto, restituirà sempre false
.
In un pizzico, si potrebbe lanciare ad un intero e poi controllare! = 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');
}
Ma una soluzione più robusta comporterebbe un certo tipo di stringa di input di validazione/filtraggio, come PHP di built-in filter_input_array()
.
(messaggio modificato l'ott/13 dal momento che continua a ricevere upvotes ed è stato un po 'confusamente formulata.) Ingresso
Ha esaurito le upvotes per il giorno, ma questa risposta in realtà dice il motivo per cui usare is_numeric.Qualsiasi parametro di richiesta HTTP inviato da POST o GET sarà sempre una stringa. –
+1 - sebbene da menzionare, 'is_numeric' non ha lo stesso effetto, come ad es. anche i valori esadecimali passano oltre agli altri (vedi php.net) – Helmut
@Helmut, sì, 'is_numeric()' non è adatto per il controllo degli ID interi. In pratica, tutti gli input dell'utente dovrebbero essere passati attraverso 'filter_var()' o qualche altra routine altrettanto esplicita. – Matthew
utente in ordine di $ _GET (così come gli altri superglobals) tutti prendono la forma di stringhe.
is_int
controlli la tipo (cioè string
) del valore, non se contiene valori interi simili. Per verificare che l'input sia una stringa intera, suggerirei qualcosa come ctype_digit
o un numero intero filter (FILTER_VALIDATE_INT
- questo ha il vantaggio di cambiare effettivamente il valore per digitare numeri interi). Ovviamente si potrebbe anche convertirlo con (int)
.
Dalla documentazione di PHP per is_int:
Nota: Per testare se una variabile è un numero o di una stringa numerica (come modulo di input, che è sempre una stringa), è necessario utilizzare is_numeric().
ingresso Qualsiasi utente viene in forma di stringa, perché PHP non ha alcun modo per dire che tipo di dati che ci si aspetta i dati siano.
Trasferirlo su un numero intero o utilizzare un'espressione regolare se si desidera assicurarsi che sia un numero intero.
<?php
$id = $_GET["id"];
if ((int) $id == 0) {
header('HTTP/1.1 404 Not Found');
exit('404, page not found');
}
?>
Prova utilizzando is_numeric
invece di is_int
. is_numeric
controlla se viene dato qualcosa che può essere un numero ($_GET
restituisce le stringhe, credo). is_int
controlli per vedere se la variabile è di tipo int
Usa is_numeric() per valutare il contenuto e l'is_int() per valutare il tipo.
Oppure, è possibile utilizzare una corrispondenza regolare per verificare se la stringa è un numero intero.
if(preg_match('/^\d+$/',$_GET['id'])) {
// is an integer
}
E '$ _GET' contiene effettivamente ... cosa? –
numeri da 1 a infinito. – ilhan