Iniezione SQL nelle funzioni Postgres vs query preparate


Risposte:


36

Dipende.

Funzioni SQL

Con LANGUAGE sql, la risposta è generalmente sì .

I parametri passati vengono trattati come valori e l'iniezione SQL non è possibile - purché non si chiamino funzioni non sicure dal corpo e si passino i parametri.

Funzioni PL / pgSQL

Con LANGUAGE plpgsql, la risposta è normalmente .

Tuttavia , PL / pgSQL consente SQL dinamico in cui i parametri (o parti) passati vengono concatenati a una stringa di query ed eseguiti con EXECUTE. Questo può convertire l'input dell'utente in codice SQL e rendere possibile l' iniezione SQL . Dall'esterno non si può dire se il corpo della funzione lo gestisce correttamente. Gli strumenti sono forniti.

Utilizzare SQL dinamico solo dove serve. Le semplici istruzioni SQL che utilizzano i parametri come valori sono sicure contro l'iniezione SQL come le funzioni SQL.

Per SQL dinamico , passare preferibilmente valori come valori con:

Rende impossibile l'iniezione SQL in linea di principio.

Se si concatenano valori nella stringa SQL, utilizzare:

Avvolge le stringhe tra virgolette singole in modo sicuro, evitando così errori di sintassi e iniezione SQL.

Parametri di processo che devono essere trattati come identificatori nella stringa SQL con:

Racchiude le stringhe tra virgolette in modo sicuro dove richiesto , evitando così errori di sintassi e iniezione SQL.

Relazionato:

Non creare mai una stringa dall'input dell'utente ed eseguirla. Ciò include identificatori, passati direttamente da un utente o recuperati da un catalogo di sistema. Tutti devono essere trattati come input dell'utente e quotati in modo sicuro durante la creazione di SQL dinamico!

Ulteriori informazioni sulle implicazioni delle prestazioni in questa risposta correlata:

Nozioni di base su SQL-injection:

Considerazioni simili si applicano ad altri linguaggi lato server che consentono SQL dinamico.


Quindi, in sintesi: se 1) uso solo il linguaggio sql, sono al sicuro, 2) se uso plpgslq ma non eseguo, sono al sicuro, 3) se uso plpgsql ed eseguo ma nessun identificatore e% s o% L come appropriato sono al sicuro, oppure 4) se uso plpgsql ed eseguo e identificatori ma% I o quote_ident come appropriato sono al sicuro. Corretta?
mickeyf_supports_Monica

@mickeyf: sostanzialmente sì. Inoltre, utilizzare la USINGclausola per passare valori a EXECUTEquando possibile. È possibile chiamare una funzione PL / pgSQL dall'interno di una funzione SQL e passare parametri. Quindi, per essere assolutamente corretti, sei al sicuro finché non chiami funzioni non sicure direttamente o indirettamente. Se tutte le tue funzioni sono eseguite correttamente, ciò non può accadere.
Erwin Brandstetter,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.