J4.x

J4.x:Movendo o Joomla para instruções preparadas

From Joomla! Documentation

Revision as of 16:26, 2 May 2022 by Gkiyoshinishimoto (talk | contribs) (Created page with "API de estrutura do Joomla")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Other languages:
Deutsch • ‎English • ‎italiano • ‎português do Brasil
Joomla! 
≥ 4.0
version

No Joomla 4, você verá a mudança do Joomla lentamente para o uso de instruções preparadas para todas as nossas consultas. Este artigo tem como objetivo definir por que e como estamos fazendo isso.

Motivação

O PHP 5.3 introduziu o conceito de instruções preparadas. No Joomla 4 vamos começar a tirar vantagem delas. A principal vantagem das instruções preparadas é reduzir a exposição de uma base de código a ataques de injeção de SQL enviando a consulta e os dados separadamente. Você pode imaginar o PHP enviando a consulta como o seguinte

Prepared Statements
Query: SELECT foobar FROM bar WHERE foo = ?
Data:  [? = 'bar']

E o próprio banco de dados fará o trabalho difícil de citar sua instrução. Como o banco de dados é responsável pela cotação, reduz a complexidade da base de código do Joomla e também reduz a chance de erros de codificação introduzindo quaisquer falhas.

Implementando instruções preparadas por meio do JDatabaseDriver

A implementação de instruções preparadas no Joomla é muito simples e multiplataforma. Por exemplo, aqui está uma consulta simples do plugin de autenticação do Joomla Joomla 3.x.

$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']));

Para convertê-la em uma instrução preparada, substituiremos o nome de usuário por um valor nomeado e, em seguida, vincularemos nossos dados reais à consulta.

$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']);

Como você pode ver, ao adicionar outra linha à consulta, não precisamos mais citar os dados - deixamos nosso banco de dados mysql/postgresql lidar com isso para nós, facilitando muito a leitura e o gerenciamento do código.

Algumas funções no JDatabaseDriver usarão instruções preparadas automaticamente. Por exemplo whereIn() e whereNotIn() usará automaticamente os valores e adicionará instruções preparadas à consulta.

$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
  );

Os espaços reservados :preparedArray1-3 serão preenchidos com 1,2,3 na execução.

As funções a seguir aceitam arranjos para reduzir a sobrecarga de chamadas de função.

  • bind()
  • bindArray()
  • whereIn()
  • whereNotIn()

Se possível, você deve usar instruções preparadas.

Leitura adicional sobre instruções preparadas