2012-01-16 2 views
7

Secondo la DOP PHP Documentazione :: preparare() aggiunge le citazioni a tutti i parametri in modo che non devi preoccuparti di farlo:Trattare con citazioni aggiunti da PDO :: preparare()

"I parametri per le istruzioni preparate non hanno bisogno di essere citati, il driver gestisce automaticamente questo, se un'applicazione utilizza esclusivamente istruzioni preparate, lo sviluppatore può essere sicuro che non si verificherà alcuna iniezione SQL (tuttavia, se altre parti della query sono in corso costruito con input senza caratteri di escape, l'iniezione SQL è ancora possibile). "

Il problema con questo per me è il modo in cui sto creando le mie query e la mia struttura di database. Di solito la parte FROM di un'istruzione SQL non dovrebbe essere parametrizzata perché probabilmente la tabella verrebbe definita dall'input dell'utente diretto. Comunque con il mio codice questo è il caso in alcuni punti e quindi mi sento più a mio agio con la versione parametrizzata.

SELECT * FROM ? WHERE ?=? 

al contrario di SELECT * FROM tablename WHERE? =?

Quindi la mia domanda è questa, è possibile impedire al mio oggetto PDO di aggiungere le virgolette attorno al parametro FROM in modo che non vengano visualizzati errori SQL in mio volto? O devo farlo in un modo diverso.

+2

Qual è la domanda esattamente? – jeroen

+0

Non aggiunge necessariamente virgolette. I driver che supportano le istruzioni preparate in modo nativo manterranno il '?' Letterale e il server del database esegue la sostituzione. - Tuttavia è necessario spiegare cosa sta facendo in modo specifico il codice e perché questo è un problema qui. L'aggiunta di ''?'' O '': placeholder'' nelle tue clausole FROM sono stringhe letterali, non parametri associati. – mario

+0

Mi dispiace, ho accidentalmente premuto invio prima che avessi finito di digitare la domanda – hamalnamal

risposta

4

I segnaposto nelle dichiarazioni preparate sono solo per valori. L'unico modo per inserire nomi dinamici delle tabelle è farlo da soli

"SELECT FROM `".$table."` WHERE `".$column."` = ?" 
+3

Ovviamente il solo avvolgimento del valore con i tick indietro non è sicuro se il contenuto della variabile proviene da una fonte contaminata. – Matthew

+0

@YourCommonSense Puoi darmi un caso d'uso, dove i nomi _table_ e _column_ provengono da una fonte fuori dal tuo controllo? Quando sono in qualche modo basati sull'input dell'utente, è molto più semplice dare loro la tua password DB. Detto questo, si può presumere che provengano da una fonte affidabile (ad esempio una configurazione o codificati in modo fisso da qualche altra parte), oppure si è fatto qualcosa di molto sbagliato. E ancora non ti impedisce di usare il tuo cervello :) – KingCrunch

+0

Discorsi economici, amico. –

2

@KingCrunch è per lo più corretto nella sua risposta. Dovresti davvero sfuggire alla stringa da solo. Qualcosa di simile dovrebbe proteggere dalla maggior parte delle iniezioni:

//make sure $table and $column only contain alphanumeric chars 
$table = preg_replace("/[^A-Za-z0-9]/", '', $table); 
$column = preg_replace("/[^A-Za-z0-9]/", '', $column); 

$query = "SELECT FROM `{$table}` WHERE `{$column}` = ?"