J4.x: Spostare Joomla in istruzioni preparate
From Joomla! Documentation
In Joomla 4 vedrai il passaggio di Joomla lentamente all'utilizzo di istruzioni preparate per tutte le nostre query. Questo articolo mira a spiegare perché e come lo stiamo facendo.
Motivazione
PHP 5.3 ha introdotto il concetto di dichiarazioni preparate. In Joomla 4 inizieremo a trarne vantaggio. Il vantaggio principale delle istruzioni preparate è ridurre l'esposizione di una base di codice agli attacchi SQL Injection inviando la query e i dati separatamente. Puoi immaginare PHP inviando la query come segue
Prepared Statements Query: SELECT foobar FROM bar WHERE foo = ? Data: [? = 'bar']
E il database stesso farà il duro lavoro per citare la tua dichiarazione. Poiché il database è responsabile della quotazione, riduce la complessità della base di codice di Joomla e riduce anche la possibilità di errori di codifica che introducono errori.
Implementazione di istruzioni preparate tramite JDatabaseDriver
L'implementazione di dichiarazioni preparate in Joomla è molto semplice ed è multipiattaforma. Ad esempio, ecco un semplice query dal plugin di autenticazione di Joomla.
$query = $this->db->getQuery(true)
->select($this->db->quoteName(array('id', 'password')))
->from($this->db->quoteName('#__users'))
->where($this->db->quoteName('username') . '=' . $this->db->quote($credentials['username']));
Per convertirlo in un'istruzione preparata sostituiremo invece il nome utente con un valore denominato e quindi assoceremo i nostri dati reali alla query.
$query = $this->db->getQuery(true)
->select($this->db->quoteName(array('id', 'password')))
->from($this->db->quoteName('#__users'))
->where($this->db->quoteName('username') . ' = :username')
->bind(':username', $credentials['username']);
Come puoi vedere mentre aggiungi un'altra riga alla query, non dobbiamo più citare i dati - lasciamo che il nostro database mysql/postgresql gestisca questo per noi dandoci molto più facile da leggere e gestire il codice.
Alcune funzioni in JDatabaseDriver useranno automaticamente le istruzioni preparate. Ad esempio whereIn () e # L1724 whereNotIn () utilizzerà automaticamente i valori e aggiungerà istruzioni preparate alla query.
$query = $this->db->getQuery(true)
->select($this->db->quoteName(array('id, password')))
->from($this->db->quoteName('#__users'))
->whereIn($this->db->quoteName('id'), [ 1, 2, 3 ]);
This query will be converted to a sql prepared statement.
SELECT
`id`, `password`
FROM
`#__users`
WHERE
`id` IN (
:preparedArray1,
:preparedArray2,
:preparedArray3
);
I segnaposto: readyArray1-3 verranno riempiti con 1,2,3 al momento dell'esecuzione.
Le seguenti funzioni accettano array per ridurre l'overhead delle chiamate di funzione.
- bind()
- bindArray()
- whereIn()
- whereNotIn()
Se possibile, utilizzare dichiarazioni preparate.