Oracle
 sql >> Database >  >> RDS >> Oracle

Oci_bind_by_name impedisce l'iniezione SQL in modo sicuro?

L'uso di parametri associati è sufficiente nei casi comuni e una buona pratica per evitare l'iniezione di SQL.

Ma un parametro in un'istruzione preparata può essere utilizzato solo per un valore in un'espressione SQL. In altre parole, dove normalmente scriveresti una stringa letterale tra virgolette, una data letterale tra virgolette o un valore letterale numerico. E un parametro ==un valore (nessuna lista).

Dovresti utilizzare parametri vincolati per quei casi. Se stai ponendo questa domanda perché pensi di voler saltare l'uso dei parametri vincolati se qualcuno risponde che non sono sufficienti, allora scusa, non verrai esonerato da pratiche di programmazione sicure.

Tuttavia, ci sono altri casi (forse meno comuni) per i quali i parametri associati non funzionano. Se devi scrivere una query con un nome di tabella dinamica, nome di colonna o altro identificatore, o un'intera espressione o una parola chiave SQL, allora hai bisogno di un altro metodo. Questi casi devono essere corretti nella sintassi SQL in prepara tempo, quindi non possono essere parametrizzati.

Ad esempio, ecco una query con parti dinamiche denotate dall'uso di variabili, che non possono essere parametri:

$sql = "SELECT * FROM mytable ORDER BY $column_of_users_choice $asc_or_desc";

Dovresti utilizzare la whitelist per questi casi . In altre parole, assicurati che una stringa che interpoli nella tua query come nome di una tabella dinamica sia effettivamente una delle tabelle esistenti nel tuo database. Assicurati che le parole chiave SQL siano parole chiave legittime.

Mai prendi l'input dell'utente alla lettera e interpolalo in SQL (o qualsiasi altro codice che viene analizzato in fase di esecuzione, come l'argomento che fornisci a eval() o shellexec() ). E non è solo l'input dell'utente che può essere contenuto non sicuro.

Vedi anche la mia presentazione Miti e errori di SQL Injection per ulteriori spiegazioni.