2011-01-25 19 views
13

Recentemente mi è stato detto che vi è FILTER_VALIDATE_INT che è molto utile.Sicurezza PHP - (int) vs FILTER_VALIDATE_INT

La mia domanda è in termini di prendere un valore intero dal sito Web sia esso proveniente dall'utente o generato dall'applicazione web e passato tramite stringa di query.

Il valore (numero intero) può essere visualizzato o utilizzato nella query mysql.

Sto cercando di strutturare il miglior metodo di sicurezza possibile per questo.

Con questo in mente, è sicuro di usare semplicemente

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

O

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

Inoltre, si prega di spiegare qual è la differenza tra l'utilizzo di (int) e FILTER_VALIDATE_INT

+0

Per espandere le risposte esistenti, 'FILTER_SANITIZE_NUMBER_INT' equivale alla trasmissione' (int) '. – mario

+3

@mario, come puoi dire questo? Non è. –

risposta

27

La differenza è che un cast a int ti darà sempre un int, che può essere o non essere l'originale valore. Per esempio. (int)'foobar' risultati nello int0. Questo lo rende sicuro per la maggior parte degli scopi SQL, ma non ha nulla a che fare con il valore originale e non lo saprai nemmeno.

filter_var con FILTER_VALIDATE_INTdice voi se il valore è un int, in base al quale si può prendere la decisione di utilizzarlo in una query SQL o visualizzare un messaggio di errore per l'utente.

+0

@deceze sapresti se c'è molta differenza tra 'filter_var' e la sua controparte' is_int'? –

+2

@Russell Dias: risultati per ''42'' almeno (numero intero rappresentato come stringa). – zerkms

+0

@zerkms Oops non si è reso conto che verifica anche una stringa numerica. Grazie per l'esempio;) –

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 
} 

Si prega di provare con quando il valore è numero.