Какие символы разрешены в полнотекстовом поиске MariaDB в режиме BOOLEAN? - PullRequest
1 голос
/ 22 мая 2019

Я хочу передать пользовательский ввод через PHP в запрос SQL к таблице InnoDB MariaDB 10.1.37, чтобы выполнить поиск.Я хочу защитить от создания недопустимых запросов SQL.В настоящее время я удаляю известные символы операторов, такие как:

preg_replace('/[\+\-\<\>\(\)\~\*\"]/', ' ', $user_input)

Затем я добавляю символ * к каждому слову.Таким образом, если пользовательский ввод foo bar, запрос будет:

SELECT columnname, MATCH(columnname) AGAINST('foo* bar*' IN BOOLEAN MODE) AS score
FROM tablename;

К сожалению, есть другие символы, которые пользователь может ввести, что нарушит запрос.Например, если пользователь вводит %, запрос будет AGAINST('%*' IN BOOLEAN MODE), который выдает ошибку: syntax error, unexpected $end, expecting FTS_TERM or FTS_NUMB or '*'.

Я мог бы попытаться отфильтровать символы, которые вызывают проблемы (черный список), или я мог бы попробоватьс символами белого списка, которые я знаю, все в порядке.

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

Существует ли известный набор символов, который разрешен либоили запрещено?

1 Ответ

0 голосов
/ 27 мая 2019

Принять противоположный подход?Решите, какие символы разрешить.

preg_replace("/[^-'a-zA-Z0-9]/", ' ', $user_input)

Сохранить:

  • Черточка для переносимых слов
  • Апостроф для сокращений

Удалить:

  • Плюс и звездочка - из-за синтаксиса FT
  • Косая черта и двойные кавычки - синтаксис PHP

Затем используйте двойные кавычки, а не апострофв

AGAINST("foo* bar*" IN BOOLEAN MODE) 
...