2012-01-22 19 views
6

Ho una pagina (index.php) che prende una variabile GET dall'URL e la controlla a fini di sicurezza. Questa variabile GET dovrebbe essere solo un numero intero. Sto usando il seguente codice per controllare questo, ma in tutti i casi, intero o no, ottengo la pagina index.php. L'intestazione non appare mai. Dopo questo codice, viene visualizzato il resto della pagina a partire dal tag html.PHP is_int non funziona come previsto

PHP:

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

Non so se lo sai già, ma dovresti aggiungere un 'exit();' dopo l'intestazione '(..)'. Altrimenti lo script continuerà a stampare i contenuti della pagina. – laher

+0

Leggendo [la documentazione] (http://php.net/manual/en/function.is-int.php) verrebbe mostrato che 'is_int()' verifica il tipo della variabile, quindi stringa con "' 123 '' in 'is_int()' non restituirà 'true', poiché si tratta di una stringa. Inoltre perché hai taggato il tuo post con 'http-status-code-404'? – Tadeck

+0

@ Tag tag rimosso. grazie per quella documentazione ora sto usando is_numeric e non funziona ancora – kirby

risposta

19

Non sarà un numero intero se è passata in una stringa di query.

Prova is_numeric()

+1

Anche 'ctype_digit()' per una stringa che consiste solo di numeri. – mrlee

+0

@alien Ho aggiornato il mio codice corrente e ottengo lo stesso comportamento di prima: [ – kirby

+0

Prova a cambiare 'ob_start;' a 'ob_start();' – AlienWebguy

5

C'è un modo migliore per fare questo, che è colata a int:

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

L'is_int è comportarsi come previsto. Perché gli argomenti GET sono sempre stringhe. Prova var_dumping loro.

+1

A pensarci bene, la risposta di AlienWebguy è probabilmente migliore in quanto sarai in grado di filtrare i valori" strani "... – Joep

0

A volte si desidera convalidare l'input che dovrebbe essere il numero ma in $_GET o $_POST si otterrà come stringa. is_numeric() può essere problematico, perché permette esadecimale, binario e formato ottale (da manuale):

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.

Non è possibile utilizzare is_int() dato che è solo per i valori interi in modo ... Lei (non stringa!) può convalidare i numeri che sono stringa E interi questo modo: funzione

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 

è anche possibile sovrascrivere is_int(), utilizzando override_function() ma ancora può essere utile in versione originale.

Problemi correlati