Definire prepared statement con MySQLi

9 luglio 2013

L’implementazione della versione 5.5 di PHP prevede che le mysql functions native del linguaggio vengano considerate deprecate, ciò significa che lo sviluppatore dovrà utilizzare in loro sostituzione le estensioni PDO o MySQLi; entrambe queste ultime supportano funzionalità più avanzate rispetto alla loro alternativa in dismissione, come per esempio la possibilità di definire prepared statements (o, meno comunemente, parameterized statements), dei costrutti, supportati da MySQL a partire dalla versione 4.1, che consentiranno alle applicazioni di interagire in modo sicuro ed efficiente con il Database manager attraverso le query.

Nel caso specifico di questa trattazione, verranno descritte le procedure necessarie per parametrare dichiarazioni tramite MySQLi.

Funzionamento dei prepared statements

Quando si affronta il discorso relativo ai prepared statements, l’accento viene posto in particolare sugli innegabili vantaggi che questo tipo di istruzioni offrono dal punto di vista delle sicurezza. Si tratta naturalmente di un aspetto non secondario, ma parametrare le dichiarazioni significa in primo luogo sfruttare un meccanismo che permetterà di eseguire ripetutamente le medesime query (o query tra loro simili) ad un livello di prestazioni più elevato, il criterio relativo all’efficienza non dovrebbe quindi essere ignorato.

I prepared statements funzionano sulla base di uno schema che prevede innanzitutto la definizione di un template da parte di un’applicazione, quest’ultimo verrà utilizzato per le dichiarazioni in quanto presenterà dei parametri che svolgeranno la funzione di placeholder e verranno via via sostituiti con i valori reali in corso d’esecuzione; tali parametri sono detti “variabili bind” e permetteranno di non specificare a priori i valori in modo da permettere la costruzione di un modello riutilizzabile.

Un semplice esempio di template per la parametrizzazione delle dichiarazioni potrebbe essere il seguente, dove i placeholder sono simboleggiati da dei punti interrogativi:

INSERT INTO tbl (cmp1, cmp2) VALUES (?, ?)

La fase relativa al confezionamento del template e al suo invio al DBMS prende il nome di “preparazione”, essa porterà il Database engine ad effettuare il parsing della dichiarazione e ad archiviarne il risultato senza per questo eseguire alcuna istruzione; nel corso della passaggio successivo, detto “esecuzione”, i parametri utilizzati come segnaposto verranno sostituiti con dei valori associati a variabili grazie ad un processo vincolante denominato “binding” e il Database manager potrà eseguire l’istruzione prevista.

Vantaggi e svantaggi dei prepared statements

Dal punto di vista dello sviluppatore, uno dei vantaggi relativi all’utilizzo dei prepared statements è identificabile nel fatto che, attraverso di essi, la logica delle istruzioni SQL verrà separata dal dataset, rendendo i sorgenti più leggibili. Ma è ancora più importante il discorso relativo alle prestazioni, infatti tali costrutti consentiranno di limitare il verificarsi di overhead (cioè richiesta di risorse accessorie) in quanto le procedure di compilazione e ottimizzazione della dichiarazione verranno eseguite una volta sola attraverso il parsing del template passato al DBMS e archiviato in memoria.

Per contro, andrebbe sottolineato che le fasi addizionali richieste dalla parametrizzazione potrebbero rendere meno performanti le esecuzioni relative ad istruzioni non ripetute, preparare una dichiarazione per una singola interazione potrebbe quindi non risultare ideale per quanto riguarda le prestazioni, ma ciò risulterebbe vero soltanto se non si prendesse in considerazione il fondamentale aspetto legato alla sicurezza.

I prepared statements costituiscono infatti una protezione contro gli attacchi basati su SQL injections, ciò è una conseguenza del fatto che in tali dichiarazioni l’SQL e i dati rimangono separati; in pratica, anche in presenza di tentativi di SQL injections questi non potranno avere successo, in quanto le istruzioni malevole non entreranno a far parte del template e i dati verranno manipolati al di fuori delle istruzioni basate su SQL.

Se vuoi aggiornamenti su Definire prepared statement con MySQLi inserisci la tua e-mail nel box qui sotto:
 
X
Se vuoi aggiornamenti su Definire prepared statement con MySQLi

inserisci la tua e-mail nel box qui sotto:

Ho letto e acconsento l'informativa sulla privacy

Acconsento al trattamento di cui al punto 3 dell'informativa sulla privacy