A rigor di termini, in realtà non è necessario eseguire l'escape, poiché il valore del parametro non viene mai interpolato nella stringa di query.
Il modo in cui funzionano i parametri della query è che la query viene inviata al server del database quando hai chiamato prepare()
e i valori dei parametri vengono inviati in seguito, quando hai chiamato execute()
. Quindi sono mantenuti separati dalla forma testuale della query. Non c'è mai un'opportunità per SQL injection (a condizione che PDO::ATTR_EMULATE_PREPARES
è falso).
Quindi sì, i parametri di query ti aiutano a evitare quella forma di vulnerabilità della sicurezza.
Sono a prova di 100% contro qualsiasi vulnerabilità di sicurezza? No certo che no. Come forse saprai, un parametro di query sostituisce solo un singolo valore letterale in un'espressione SQL. Non puoi sostituire un singolo parametro per un elenco di valori, ad esempio:
SELECT * FROM blog WHERE userid IN ( ? );
Non puoi utilizzare un parametro per rendere dinamici i nomi delle tabelle o delle colonne:
SELECT * FROM blog ORDER BY ?;
Non puoi usare un parametro per nessun altro tipo di sintassi SQL:
SELECT EXTRACT( ? FROM datetime_column) AS variable_datetime_element FROM blog;
Quindi ci sono alcuni casi in cui devi manipolare la query come una stringa, prima di prepare()
chiamata. In questi casi, è comunque necessario scrivere il codice con attenzione per evitare l'iniezione SQL.