Mysql
 sql >> Database >  >> RDS >> Mysql

Dovresti usare dichiarazioni preparate solo per la loro fuga?

La differenza considerata trascurabile.

Tuttavia, bisogna distinguere le dichiarazioni preparate dai nativi dall'idea generale di una dichiarazione preparata.

Il primo è solo una forma di esecuzione di query supportata dalla maggior parte dei DBMS, spiegato qui . Il suo utilizzo può essere messo in dubbio.
Quest'ultima è un'idea generale di sostituzione dei dati effettivi con un segnaposto, che implica un'ulteriore elaborazione dei dati sostituiti. È ampiamente usato nella programmazione, un noto printf() la funzione è un esempio. E quest'ultimo approccio deve essere SEMPRE utilizzato per eseguire una query su un database , non importa se è supportato da dichiarazioni preparate native o meno. Perché:

  • L'istruzione preparata rende la formattazione (o la gestione) corretta inevitabile .
  • l'istruzione preparata esegue la formattazione (o la gestione) corretta nell'unico posto corretto - subito prima dell'esecuzione della query, non da qualche altra parte, quindi la nostra sicurezza non si baserà su fonti inaffidabili come
    • qualche caratteristica 'magica' di PHP che rovina i dati piuttosto che renderli sicuri.
    • buona volontà di uno (o più) programmatori, che possono decidere di formattare (o non formattare) la nostra variabile da qualche parte nel flusso del programma. Questo è il punto di grande importanza.
  • L'istruzione preparata influisce sul valore stesso che sta entrando nella query, ma non sulla variabile sorgente, che rimane intatta e può essere utilizzata nell'ulteriore codice (da inviare via e-mail o mostrata sullo schermo).
  • L'istruzione preparata può ridurre notevolmente il codice dell'applicazione, eseguendo tutta la formattazione dietro le quinte (*solo se il driver lo consente).

Quindi, anche se consideri di non utilizzare istruzioni preparate native (il che va bene), devi sempre creare le tue query utilizzando segnaposto anziché i dati effettivi. A tale scopo puoi utilizzare PDO , che funziona esattamente come descritto sopra:per impostazione predefinita, si limita a emulate prepara , significa che una query SQL regolare viene creata da query e dati preparati e quindi eseguita sul database.

Tuttavia, PDO non supporta molti tipi di dati importanti, come identificatore o un array, quindi non è possibile utilizzare sempre i segnaposto e quindi rende possibile un'iniezione. Fortunatamente, safeMysql dispone di segnaposto per ogni tipo di dati e consente di eseguire query in modo sicuro.