Переход к использованию подготовленных инструкций для запросов в Joomla 4



Введение в реализацию подготовленных отчетов Joomla 4

В Joomla 4 вы увидите, как Joomla постепенно переходит к использованию подготовленных инструкций для всех наших запросов. Цель этой статьи — объяснить, почему и как мы это делаем.

Причина реализации подготовленных отчетов в Joomla 4

В PHP 5.3 введена концепция подготовленных операторов. В Joomla 4 мы собираемся начать использовать их в своих интересах. Основное преимущество подготовленных операторов состоит в том, чтобы уменьшить подверженность базы кода атакам SQL-инъекций, отправляя запрос и данные отдельно. Вы можете представить, как PHP отправляет запрос следующим образом:

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

После этого сама база данных выполнит тяжелую работу по разбору вашего заявления. Поскольку база данных отвечает за разбор запроса, это снижает сложность кодовой базы Joomla, а также снижает вероятность ошибок в кодировании, приводящих к каким-либо ошибкам.

Реализация подготовленных отчетов через JDatabaseDriver

Реализация подготовленных заявлений в Joomla очень проста и является кроссплатформенной. Например, вот простой запрос Joomla 3.x из плагина аутентификации 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']));

Чтобы преобразовать его в подготовленный оператор, мы вместо имени пользователя заменим именованное значение, а затем свяжем наши реальные данные с запросом.

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

Как вы можете видеть, добавляя еще одну строку в запрос, нам больше не нужно указывать данные — мы позволяем нашей базе данных mysql/postgresql обрабатывать это за нас, что значительно облегчает чтение кода и управление им.

Некоторые функции в JDatabaseDriver будут автоматически использовать подготовленные инструкции. Например, whereIn() и whereNotIn() автоматически будут использовать значения и добавлять подготовленные операторы в запрос.

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

Этот запрос будет преобразован в подготовленную инструкцию sql.

SELECT 
  `id`, `password`
FROM
  `#__users`
WHERE
  `id` IN (
    :preparedArray1,
    :preparedArray2,
    :preparedArray3
  );

Заполнители :preparedArray1-3 будут заполнены 1,2,3 при выполнении.

Следующие функции принимают массивы, чтобы уменьшить накладные расходы на вызов функций.

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

Везде, где возможно, вам следует использовать подготовленные инструкции.

Перевод с английского официальной документации Joomla 4:
https://docs.joomla.org/J4.x:Moving_Joomla_To_Prepared_Statements

Заберите ссылку на статью к себе, чтобы потом легко её найти ;)

Выберите, то, чем пользуетесь чаще всего:

Спасибо за внимание, оставайтесь на связи! Ниже ссылка на форум и обсуждение ; )

Войдите чтобы комментировать