Le query parametrizzate consentono di passare valori alla query tramite parametri speciali, anziché direttamente tramite la sostituzione delle variabili. Questo aumenta la sicurezza e protegge dalle iniezioni SQL, oltre a velocizzare l'esecuzione delle query ripetitive grazie alla memorizzazione nella cache del piano.
Il SQL dinamico consente di costruire ed eseguire query al volo (ad esempio, tramite EXEC sp_executesql in MS SQL o PREPARE/EXECUTE in PostgreSQL). È necessario essere molto cauti: la sostituzione dei valori direttamente nel testo della query può portare a iniezioni SQL, errori di sintassi e scarsa performance.
Esempio di query parametrizzata (in Python con la libreria psycopg2):
cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))
Esempio di SQL dinamico in PostgreSQL:
EXECUTE format('SELECT * FROM %I WHERE value = %L', tablename, value);
Domanda: Perché semplicemente scappare le virgolette ('), come fanno alcune vecchie applicazioni, non è sufficiente per proteggersi dalle iniezioni SQL?
Risposta:
Scappare le virgolette non proteggerà da tutti i tipi di iniezioni, specialmente se un malintenzionato inserisce una struttura di una query SQL (ad esempio, "; DROP TABLE users;"). Inoltre, non copre tutte le peculiarità dei diversi tipi di dati e non protegge contro la penetrazione dei filtri tramite codifica o caratteri speciali. È sempre necessario utilizzare query parametrizzate.
Storia
Storia
Storia
In un CRM, la lettera “O'Connor” ha causato un errore nell'applicazione che costruiva le query SQL semplicemente concatenando stringhe. A causa della virgoletta singola non scappata, nessuna scheda con quel cognome veniva salvata, cosa che si è scoperta solo dopo un anno.