J4.x

J4.x: Spostare Joomla in istruzioni preparate

From Joomla! Documentation

This page is a translated version of the page J4.x:Moving Joomla To Prepared Statements and the translation is 100% complete.

Other languages:
English • ‎italiano
Joomla! 
≥ 4.0
version

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 Joomla 3.x 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.

Ulteriori letture su dichiarazioni preparate