Обход фильтров: похожие буквы, невидимые символы и склонения
Почему «кaзино» с латинской «a» проходит обычный фильтр и что должен делать нормальный алгоритм.
Простой фильтр сравнивает строки. Спамер знает это лучше вас и обходит сравнение тремя приёмами.
Приём первый: похожие буквы
В кириллице и латинице есть визуально одинаковые символы: «а», «о», «е», «с», «р», «х». Слово «казино» с одной латинской буквой выглядит идентично, но для сравнения строк это другое слово.
Что делать: приводить текст к общему виду до сравнения — заменять латинские двойники на кириллические (или наоборот) и только потом искать совпадение.
Приём второй: невидимые символы
Между букв вставляется символ нулевой ширины. Глазом не видно, для фильтра — «казино».
Что делать: вырезать управляющие и невидимые символы перед проверкой. Заодно нормализовать Unicode: одна и та же буква бывает записана по-разному.
Приём третий: склонения и окончания
«Казино», «казину», «казиношка» — для человека одно и то же, для подстроки — разные слова. Наивный поиск подстроки ловит первые два и даёт ложные срабатывания на безобидных словах: «сток» найдётся внутри «восток».
Что делать: сравнивать пословно, допуская окончание в пределах трёх символов. Так «казину» ловится, а «восток» остаётся чистым.
Чего фильтр не решит
Спам без запрещённых слов — «пишите в личку, есть предложение». Здесь работают другие сигналы: возраст аккаунта, частота сообщений, ссылки в профиле, репутация из общих баз.
Как это устроено у нас — на странице модерации.