2009-09-08 16 views
8

Sappiamo tutti che SQL con parametri è la strada da percorrere quando si tratta di input dell'utente e SQL dinamico, ma è colata da stringa a int (o doppio, o lungo, o qualsiasi altra cosa) come efficace se l'input che stai cercando è numerico?SQL Protezione Injection - Fusioni da stringa a int

Credo che quello che sto chiedendo è se questa tecnica da sola è infallibile per quanto riguarda SQL injection?

risposta

10

Non sono esperto, ma sono ragionevolmente sicuro che questo sarebbe sicuro.

Ma perché rischiare? Usa l'SQL parametrizzato e non dovrai mai preoccupartene.

Inoltre, la parametrizzazione del codice SQL presenta altri vantaggi, non solo protezione dell'iniezione.

1

sua cassetta di sicurezza per quanto riguarda la prevenzione di SQL injection ma non è davvero una buona idea, come si ottiene un'eccezione, che si vuole sempre di evitare, se possibile, come eccezioni sono costosi. Dovresti veramente disinfettare correttamente l'input. E, naturalmente, l'utente può ancora modificare il valore su qualsiasi intervallo all'interno di un valore int32.

2

Se la stringa era un numero valido prima di essere convertito in intero sì, è sicuro. Ma devi assicurarti che sia un numero intero valido prima di trasmetterlo a int.

Non so che lingua lato server che si sta utilizzando, ma in PHP è possibile utilizzare la funzione is_numeric(). Per esempio:

$strYouExpectToBeInt = $_POST['id']; 
try { 
    if (false === is_numeric($strYouExpectToBeInt)) { 
     throw new Exception('id is not a numeric string or a number'); 
    } 
    $strYouExpectToBeInt = (int)$strYouExpectToBeInt; 
    if (false === is_int($strYouExpectToBeInt)) { 
     throw new Exception('id is not a valid integer'); 
    } 

    // everything is ok, you can use $strYouExpectToBeInt 
    // in SQL query now 

} catch (Exception $e) { 
    echo $e->getMessage(); 
} 
+0

Amico, perché usi la costante alla sinistra? – arthurprs

1

Probabilmente, ma vale la pena di test.

Per quanto riguarda la risposta di Richard, a volte ho avuto problemi con IsNumeric() essere un po 'più liberale in quello che accetterà come un numero valido rispetto all'effettivo CAST a numerico (in realtà dipende dalle impostazioni di localizzazione). Stuff come "-0", "3E-5", "5.000.000" a volte soddisfa IsNumeric, ma non trasmettono correttamente. Quindi di solito faccio un tentativo completo, ma cerco l'effettivo cast statement.

+0

Sì, è per questo che uso anche is_int() dopo il casting per essere sicuro. –