EverHoot

Обход фильтров: похожие буквы, невидимые символы и склонения

Почему «кaзино» с латинской «a» проходит обычный фильтр и что должен делать нормальный алгоритм.

Простой фильтр сравнивает строки. Спамер знает это лучше вас и обходит сравнение тремя приёмами.

Приём первый: похожие буквы

В кириллице и латинице есть визуально одинаковые символы: «а», «о», «е», «с», «р», «х». Слово «казино» с одной латинской буквой выглядит идентично, но для сравнения строк это другое слово.

Что делать: приводить текст к общему виду до сравнения — заменять латинские двойники на кириллические (или наоборот) и только потом искать совпадение.

Приём второй: невидимые символы

Между букв вставляется символ нулевой ширины. Глазом не видно, для фильтра — «каз​ино».

Что делать: вырезать управляющие и невидимые символы перед проверкой. Заодно нормализовать Unicode: одна и та же буква бывает записана по-разному.

Приём третий: склонения и окончания

«Казино», «казину», «казиношка» — для человека одно и то же, для подстроки — разные слова. Наивный поиск подстроки ловит первые два и даёт ложные срабатывания на безобидных словах: «сток» найдётся внутри «восток».

Что делать: сравнивать пословно, допуская окончание в пределах трёх символов. Так «казину» ловится, а «восток» остаётся чистым.

Чего фильтр не решит

Спам без запрещённых слов — «пишите в личку, есть предложение». Здесь работают другие сигналы: возраст аккаунта, частота сообщений, ссылки в профиле, репутация из общих баз.

Как это устроено у нас — на странице модерации.