RSS   Twitter   Copiny   Copiny
Нашел ошибку? 

Выдели фрагмент текста с ошибкой или неточностью и нажми Ctrl+Enter!

Безопасный полнотекстовый поиск в базе данных Joomla

Часто приходится писать расширения, которые используют полнотекстовый поиск по базе данных. Один из таких компонентов — это поиск по сайту. Тут нельзя обойтись простым экранированием, а строка может содержать специфические символы. Для этих целей обычно пользуются LIKE — что очень не безопасно. Попробуем разобраться, как уменьшить риск полнотекстового поиска по базе данных Joomla.

Но как не крути конструкцию LIKE %…% приходится использовать для поиска по базе данных Joomla. Некоторая сложность возникает если мы попытаемся искать специальные символы, который по идее нужно экранировать перед использованием в MySQL-запросах. Существует два основных метода класса JDatabase, которые призваны помочь нам: getEscaped() — для экранирования спец символов и Quote() для обрамления кавычками. Например

// получаем объект базы данных

$db =& JFactory::getDBO();

// подготовка строки для поиска

$escaped = $db->getEscaped($searchFor, true);

$quoted  = $db->Quote('%' . $escaped . '%', false);



// собираем запрос

$like = $db->nameQuote('columnName') . ' LIKE ' . $quoted;


Обычно, когда мы используем JDatabase:Quote(), в нашей строке автоматически экранируются специальные символы. Такие символы как «%" (процент) и «_» (подчеркивание) тоже будут верно экранированы при использовании второго параметра (в примере выше он установлен на «false»). Если это не сделать, то запрос будет выполнен с ошибкой. Для того чтобы верно использовать эту строку воспользуемся методом JDatabase:getEscaped(), в качестве второго параметра которого принимается необязательный параметр, который указывает были ли экранированы спец символы «%" и «_». После этого собираем запрос полностью, обрамляя обработанные строки знаком «%», кавычками и формируем весь запрос.

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

Имя переменойЗначение переменной
$searchFor We are 25% through the_chapter
$escaped We are 25\% through the\_chapter
$quoted '%We are 25\% through the\_chapter%'
$like 'columnName' LIKE '%We are 25\% through the\_chapter%'

 

Пример можно сделать более гибким, если заменить все пробелы символом «%» (напомним, что в контексте MySQL он обозначает любое кол-во символов). В итоге получаем код следующего вида:

// разделяем исходную строку по пробельным символам
$words = preg_split('~[\s,\.]+~', $searchFor);
// перебираем слова, и экранируем в каждом из них символы
for ($i = 0; $i < count($words); $i ++) {
    $words[$i] = $db->getEscaped($words[$i], true);
}

// собираем массив в строку и обрамляем полученную строку кавычками
$quotedSearch = implode('%', $words);
$quotedSearch = $db->Quote('%' . $quotedSearch . '%', false);

// собираем готовый sql
$like = $db->nameQuote('columnName') . ' LIKE ' . $quoted;

Посмотрим значения переменных из этого листинга во время выполнения кода.

Имя переменойЗначение переменной
$searchFor We are 25% through the_chapter
$words array('We', 'are', '25%', 'through', 'the_chapter')
$words array('We', 'are', '25\%', 'through', 'the\_chapter')
$quotedSearch We%are%25\%%through%the\_chapter
$quotedSearch '%We%are%25\%%through%the\_chapter%'
$like 'columnName' LIKE '%We%are%25\%%through%the\_chapter%'

Смотрите также:
Комментарии (1) Добавить комментарий
  • v
    v
    02 Августа 2012, 00:58
     ↑  -1  ↓     ответ

    vgngn

Оставить комментарий




* обязательно для заполнения

1 введенный почтовый адрес используется только для обратной связи при ответах в комментариях и сервиса gravatar.com
.