Joomla 1.5 LIKE и подчеркивания — лажа $db->Quote()

Discussion in 'Вопросы безопасности' started by sergiks, Jul 5, 2011.

  1. sergiks
    Offline

    sergiks Недавно здесь => Cпециалист <=

    Joined:
    Oct 10, 2010
    Messages:
    362
    Likes Received:
    36
    Gender:
    Male
    Наткнулся сейчас на одно несовершенство в Joomla 1.5, а именно: JDatabase::Quote() не ескейпит символы % и _

    Что это значит на практике

    Символы % и _ заменяют собой "сколько угодно" и "один" любой символ — как * и . в регулярных выражениях — в SQL запросах с использованием LIKE. Например запрос
    Код (CODE):
    1. SELECT id FROM jbj_users WHERE email LIKE '%vassia%'
    находит вам всех пользователей с эл. почтой похожей на vassia, причем, что-то еще может быть как до, так и после этой подстроки: vassia@mail.ru и NEVAssia@yandex.ru — все попадут в ощип.

    Обычно подстроку для поиска получают из заполненной пользователем формы:
    Код (PHP):
    1. $search = JRequest::getVar('search');
    и затем ее квотят и подают в запрос:
    Код (PHP):
    1. $query = 'SELECT id FROM jbj_users WHERE email LIKE ' . $db->Quote($search);

    Вот тут и получается, что если у человека адрес почты v_v_n@bk.ru , а в системе уже есть vovan@bk.ru , то может случиться, что новому откажут в регистрации под предлогом того, что такой адрес уже зарегистрирован.

    Где собака порылась

    JDatabase::Quote() вызывает для грязной работы функцию getEscaped(), принимающую два параметра. Второй — необязательный, по умолчанию false, как раз включает дополнительный escape % и _. Но он пропущен в вызове и потому всегда выключен.
    getEscaped() в свою очередь, переопределяется в JDatabaseMySQL и JDatabaseMySQLi. В обоих случаях, при включенном втором параметре, результат просто обрабатывается дополнительно стандартной функцией PHP addcslahses:
    Код (PHP):
    1. $result = addcslashes( $result, '%_' );

    Так что при желании, можно просто добавить эту строку в свой код, и тогда V_v_n и Vovan смогут жить дружно на одном сайте.
     
  2.  

Share This Page

Loading...