Ми}{@лbI4

Блог хеллоуворлдщика

Экранирование спец-символов в LIKE

16.03.2021 php, mysql, escape, совет

Как правило ни одна ORM не умеет экранировать спец-символы в LIKE и разработчик должен об этом позаботиться сам. Опасного в том, что вы забудете это сделать, или не делали по какой-то другой причине, нет. Пользователь лишь будет находить записи, которые совсем не ожидал увидеть.

В MySQL и PostgreSQL для LIKE используются следующие входящие специальные символы (в других БД могут быть и другие):

  • %;
  • _;
  • \.

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

Поэтому, нам нужно эти символы экранировать согласно требованиям БД:

/**
 * @param string $value
 * @return string
 */
function escapeLikeValue($value)
{
    return addcslashes($value, '\\%_');
}

$query->andWhere('username LIKE ?', '%' . escapeLikeValue($_GET['query']) . '%');