ProgrammazioneSviluppatore Fullstack

Parlami delle query parametrizzate e del SQL dinamico. Quando utilizzare ciascun approccio, quali rischi sono collegati al SQL dinamico e come evitarli? Fai degli esempi.

Supera i colloqui con l'assistente IA Hintsage

Risposta.

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 insidiosa.

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

In uno dei sistemi di calcolo stipendi, il SQL dinamico generava rapporti. A causa della mancanza di supporto per la parametrizzazione nel vecchio framework, si concatenavano manualmente le stringhe. Un utente ha accidentalmente (o forse no) passato un frammento SQL nel campo "cognome" - questo ha permesso di accedere agli stipendi altrui.

Storia

Un piccolo negozio online utilizzava SQL dinamico per filtrare i prodotti senza una valida validazione. Quando un utente tentava di inserire un valore non standard, si verificava un errore del parser SQL, che ``metteva a terra'' per un po' l'emissione di tutti i prodotti.

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.