Лучший способ предотвратить инъекции SQL в Joomla

Я беру переменные из метода POST и запрашиваю их на MySQL с помощью Joomla 2.5.

Какой самый защищенный метод для использования? В настоящее время я использую JRequest :: getVar с mysql_real_escape_string. Правильно ли это?

  1. $ _POST с mysql_real_escape_string

    $ password = mysql_real_escape_string ($ _ POST ["pwd"]));

  2. JRequest :: getVar с mysql_real_escape_string

    $ password = mysql_real_escape_string (JRequest :: getVar ('pwd', '', 'post'));

  3. JRequest :: GETVAR

    $ password = JRequest :: getVar ('pwd', '', 'post');

  4. JInput

    $ password = $ jinput-> get ('pwd', '', 'STRING');

  5. JInput с mysql_real_escape_string

    $ password = mysql_real_escape_string ($ jinput-> get ('pwd', '', 'STRING'));

Или что-то другое ?

ИЗМЕНИТЬ 1:

Я нашел другой метод, который управляет символами с помощью mysql_real_escape_string http://docs.joomla.org/API15:JDatabaseMySQL/getEscaped

Вот мой код запроса.

$db = JFactory::getDbo(); $query = $db->getQuery(true); $query->select(array('username', 'password', 'state','name')); $query->from('#__dbusers'); $query->where('username = \''.$loginUsername.'\' AND password = \''.$loginPassword.'\' AND state > -1'); $db->setQuery($query); $results = $db->loadObjectList(); 

EDIT 2: Framework 11.1 метод escape () для MySQL

 public function escape($text, $extra = false) { $result = mysql_real_escape_string($text, $this->getConnection()); if ($extra) { $result = addcslashes($result, '%_'); } return $result; } 

Поскольку escape () использует mysql_real_escape_string () Будет ли безопасно использовать, как показано ниже?

$ loginUsername = mysql_real_escape_string (JRequest :: getVar ('пользователь', '', 'post', 'STRING'));

В Joomla !, вы никогда не имеете прямого доступа к любому из суперглобалов. Кроме того, вы всегда должны различать входящие и исходящие данные. Таким образом, чтобы получить входящее значение из запроса, используйте

 $password = $jinput->get('pwd', '', 'STRING'); 

( JInput – правильный выбор, JRequest устарел и будет удален в будущем.) Теперь у вас есть чистая ценность для работы. Он подготовлен к работе с PHP.

Следующее – использовать значение в запросе SQL ( исходящее ), вам нужно избежать его корректной работы.

 $query->where("username = " . $db->quote($loginUsername) . " AND password = " . $db->quote($loginPassword) . " AND state > -1"); 

В отличие от $db->escape() , $db->quote() добавляет кавычки, необходимые базовому движку базы данных.

Почему бы не справиться с этим в один шаг?

Ну, в какой-то момент вам может понадобиться другой тип вывода, например. в представлении (даже если пароль не подходит для этого примера, я использую его для согласованности):

 echo $this->escape($password); // applies html_specialchars in HTML views 

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

Я думаю, что этот вопрос скрывает несколько заблуждений, поэтому я выложу правильный ответ.

Прежде всего, mysql_real_escape_string () является функцией из унаследованного расширения mysql. Как таковой:

  • Он больше не поддерживается
  • Это вызовет предупреждения E_DEPRECATED в PHP / 5.5
  • Он больше не будет доступен в будущих версиях PHP

И я не говорю о функции, я говорю о всем расширении.

Кроме того, вы не можете использовать его, если вы не используете устаревшее устаревшее расширение mysql. Если вы используете PDO, MySQLi, ADODB или что-то еще, это бесполезно, и это не сработает. Разумеется, он не будет работать, если вы используете SQLite, Oracle, SQL Server или PostgreSQL. Все расширения базы данных имеют (или должны иметь) альтернативный инструмент.

Теперь структура Joomla предоставляет свои собственные классы баз данных. Вы, кажется, используете версию 2.5, а escape-функция – JDatabase::quote() . Вот как эта функция работает в Joomla. Я действительно не понимаю, почему вы думаете, что это может быть ненадежным, но, если вы так думаете, вам лучше отказаться от полной JDatabase и использовать что-то еще. То, что вы не можете сделать, это смешивать материал с разных расширений, которые не предназначены для совместной работы.

Изменить: я схватил Joomla 2.5 и посмотрел исходный код. Функция quote() является оболочкой для escape() , которая принадлежит абстрактному классу JDatabase , который реализует интерфейс JDatabaseInterface . Существует три реализации:

  • JDatabaseMySQL

     /** * Method to escape a string for usage in an SQL statement. * * @param string $text The string to be escaped. * @param boolean $extra Optional parameter to provide extra escaping. * * @return string The escaped string. * * @since 11.1 */ public function escape($text, $extra = false) { $result = mysql_real_escape_string($text, $this->getConnection()); if ($extra) { $result = addcslashes($result, '%_'); } return $result; } 
  • JDatabaseMySQLi

     /** * Method to escape a string for usage in an SQL statement. * * @param string $text The string to be escaped. * @param boolean $extra Optional parameter to provide extra escaping. * * @return string The escaped string. * * @since 11.1 */ public function escape($text, $extra = false) { $result = mysqli_real_escape_string($this->getConnection(), $text); if ($extra) { $result = addcslashes($result, '%_'); } return $result; } 
  • JDatabaseSQLSrv

     /** * Method to escape a string for usage in an SQL statement. * * The escaping for MSSQL isn't handled in the driver though that would be nice. Because of this we need * to handle the escaping ourselves. * * @param string $text The string to be escaped. * @param boolean $extra Optional parameter to provide extra escaping. * * @return string The escaped string. * * @since 11.1 */ public function escape($text, $extra = false) { $result = addslashes($text); $result = str_replace("\'", "''", $result); $result = str_replace('\"', '"', $result); $result = str_replace('\\\/', '/', $result); $result = str_replace('\\\\', '\\', $result); if ($extra) { // We need the below str_replace since the search in sql server doesn't recognize _ character. $result = str_replace('_', '[_]', $result); } return $result; } 

Итак, quote() совпадает с mysql_real_escape_string() ? Очевидно нет. Он делает то же самое? Да.