2010-07-08 15 views
7

Ho un'applicazione che prende i dati tramite una richiesta POST. Sto usando questi dati per inserire una nuova riga nel database. So che usare mysql_real_escape_string() (oltre a rimuovere% e _) è la strada da percorrere per le stringhe, ma per quanto riguarda i valori interi? In questo momento, sto usando la funzione PHP intval() su di loro.Sanificazione intero di ingresso Database

Tuttavia, volevo essere sicuro che intval() sia perfettamente sicuro. Non riesco a vedere un modo di un attaccante preformatura un attacco di SQL injection quando le variabili sono gestiti attraverso intval() prima (dal momento che restituisce sempre un numero intero), ma ho voluto assicurarsi che questo è il caso da parte di persone che hanno più esperienza di me .

Grazie.

+0

Avviso: se si hanno a che fare con numeri maggiori di 32 o 64 bit (a seconda della piattaforma) 'intval()' restituirà zero. Questo è ovviamente indesiderato se stai tentando di memorizzare numeri molto grandi nel tuo database. Ad esempio, gli ID di Facebook non si adattano a 32 bit per anni http://developers.facebook.com/blog/post/45 –

+0

@Frank Farmer: Hm .. è interessante. Grazie per il testa a testa. Vedrò cosa possiamo fare per risolvere il problema, se necessario. –

risposta

21

Sì, intval() è sicuro. Non c'è assolutamente alcun modo di eseguire un'iniezione SQL quando il parametro viene convertito in numero intero, perché (ovviamente) il formato di un intero non consente di inserire parole chiave SQL (o virgolette o altro) in esso.

+0

Ok, questo è quello che pensavo. Grazie. –

+4

Si potrebbe anche usare '(int) $ id' perché il cast è molto più veloce dell'uso della funzione' intval ($ id) '. Verifica: http://hakre.wordpress.com/2010/05/13/php-casting-vs-intval/ – DaFrenk

+0

Sei sicuro? Perché intval è molto permissivo su quello che serve come parametro di input. Questo codice produce risultati interi corretti ma non vorrei mai tali valori all'interno delle mie query: '$ var =" 123TYPE_JUGGLING "; var_dump (is_numeric ($ var)); var_dump ((int) $ var); var_dump (intval ($ var)); ' –

4

Il modo più semplice per prevenire SQL injection è di usare sempre statments preparati. Utilizzare le librerie mysqli o meglio ancora un ORM come dottrina ecc

Le query poi diventare qualcosa di simile:

$stmt = $db->prep_stmt("select * from .... where userid = ? and username = ?"); 

/* Binding 2 parameters. */ 
$stmt->bind_param("is", $userid, $username); 

$userid = 15; 
$username = "don"; 

/* Executing the statement */ 
$stmt->execute() or die ("Could not execute statement"); 
+2

+1 per le dichiarazioni preparate. Tuttavia, continuerei a convalidare i dati di input dell'utente prima di eseguire un inserimento per evitare un'eccezione SQL. A meno che, naturalmente, l'ORM o il framework non lo facessero per me. –

+0

Sfortunatamente, le istruzioni preparate non sono disponibili per questo particolare progetto. –

2

faccio sempre

$var = (int)$_POST['var']; 

per assicurarsi $ var viene gestita come un numero intero in tutte le circostanze e mai più $ _POST ['var'] di nuovo. Guardando il manuale, intval() fa esattamente la stessa cosa.

In qualsiasi modo, in sottosequenza $ var sarà un numero intero effettivo, che è abbastanza sicuro da gestire.

2

statment preparati è il modo migliore per affrontare sql injection. o utilizzare PDO altrimenti, intval è migliore di is_numeric

Problemi correlati