2011-11-05 13 views
7

Ho preso l'abitudine di filtrare la variabile inviata dall'utente tramite la mia funzione int che si assicura che sia un numero (se non restituisce 0) e non cita la variabile nelle query mysql.virgolette sui valori int in query mysql

È una cattiva pratica? Penso di aver deciso di farlo per motivi di prestazioni. Inoltre ho sempre pensato che i numeri non dovrebbero essere messi tra virgolette.

Esempio:

if($perpage != $user['perpage']){ 
if($perpage == 50 || $perpage == 100 || $perpage == 200){ 
$DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]", __FILE__, __LINE__); 
} 
} 
+0

Sono interessato a sapere se guadagno qualcosa in termini di prestazioni facendo questo. Ovviamente mi sentirei molto più sicuro inserendoli tra virgolette. – domino

+0

sembra che tu stia usando un modo antico per ottenere il file e la riga dell'errore. Non è necessario impostarlo manualmente al giorno d'oggi. trigger_error() o debug_backtrace() lo farà per te –

+0

come per le prestazioni. Hai problemi con esso in questo momento? –

risposta

5

aha! un caso interessante qui!

  1. Hai ragione in generale. E 'sempre meglio per trattare i numeri come numeri, non stringhe

    • rende il codice più sano e coerente
    • un ambiente strict_mode in MySQL, che non consentirà di fare mascherare un numero come una stringa, se acceso.
  2. Ma la tua implementazione consente infatti un'iniezione! Lasciamo per i compiti a casa per trovarlo :)

Qui è un riferimento per voi, spiegando questa iniezione: http://php.net/language.types.type-juggling

così, mi piacerebbe fare il vostro codice come questo

$perpage = intval($perpage); 
if($perpage != $user['perpage'] && in_array($perpage,array(50,100,200) { 
    $DB->query("UPDATE users SET perpage=$perpage WHERE id=$user[id]"); 
} 
+0

Penso che ti sia mancato il secondo "se". Il valore può essere solo 50, 100 o 200. Non c'è spazio per le iniezioni. ;) – domino

+0

Primo tentativo fallito :) –

+0

Non capisco. Se non fossero passati quei tre numeri alla query, sarebbe vulnerabile. $ per pagina non può essere nient'altro che un numero comunque. – domino

2

Fino a quando i valori sono adeguatamente controllati attraverso l'uso del metodo di intval di PHP prima di utilizzarli, non vedo un problema con esso. Potresti farti dei favori in futuro se lo facessi, se dovessi interagire con un DB che pensa che le virgolette attorno ai valori int siano un errore di sintassi. (Credo che MS SQL Server lo faccia.)