Защита от спама в Rails

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

Я уже знаю о паре спам-сервисов, таких как Akismet (через rakismet) и Defensio (через защитник). Проблема с ними в том, что похоже, что они не учитывают сообщения, которые пользователь уже отправил. Тип спама, который я вижу на своем сайте, это когда пользователь отправляет одни и те же (или очень похожие) сообщения многим другим пользователям. Таким образом, я хотел бы иметь возможность сравнить хотя бы с несколькими прошлыми сообщениями, чтобы убедиться, что они достаточно разные, чтобы не считаться спамом.

На данный момент лучшее, с чем я столкнулся, — это реализация Text::Levenshtein Distance, которая вычисляет число различий между двумя строками. Я полагаю, я мог бы рассчитать количество различий, деленное на длину строки, и если оно превышает определенный порог, то это не считается спамом.

Еще одна вещь, с которой я столкнулся, это Classifier::Bayes, который позволяет лучше всего предположить, к какой категории относится что-либо. падает в. Все еще размышляю над этим.

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


person Matt Huggins    schedule 13.08.2011    source источник
comment
Я добавил akismet на свой сайт и разместил об этом небольшой пост в блоге: frick-web.com/en/blog/stopping-spam-with-akismet — возможно, это вам поможет.   -  person Matthias    schedule 26.07.2013


Ответы (1)


Не пытайтесь создать собственное решение для этого, это намного сложнее, чем вы ожидаете. На самом деле это одна из тех вещей, таких как шифрование, где гораздо лучше отдать ее на откуп кому-то/чему-то, кто действительно хорош в этом. Вот некоторая предыстория для вас.

О расстоянии Левенштейна, безусловно, полезно знать (никогда не знаешь, когда пригодится метрика подобия), но для решения данной конкретной задачи его использовать нельзя.

Байесовский классификатор намного ближе к тому, что вам нужно. На самом деле обнаружение спама — это в значительной степени канонический пример того, как наивный байесовский классификатор может проделать огромную работу. Сказав это, вам придется найти большую коллекцию данных (сообщений), которые были классифицированы как спам и не спам и которые аналогичны типам сообщений, которые вы получаете на своем сайте. Затем вам нужно будет обучить свой классификатор и измерить его производительность. Вам нужно будет настроить его и убедиться, что вы не переобучаете его и т. д. Хотя Classifier::Bayes является достойной базовой реализацией, он не даст вам большой поддержки для этого. На самом деле Ruby страдает от отсутствия хороших библиотек для обработки естественного языка. В Ruby нет ничего, что можно было бы сравнить с NLTK Python.

Сказав все это, такие сервисы, как akismet, безусловно, будут иметь байесовский классификатор в качестве одного из инструментов, которые они используют для определения того, является ли то, что вы им отправляете, спамом или нет. Этот классификатор, вероятно, будет гораздо более сложным, чем тот, который вы можете создать самостоятельно, хотя бы по той причине, что у них также есть доступ к такому большому количеству данных. Вероятно, у них также есть другие типы классификаторов/алгоритмов, которые они будут использовать, в конце концов, это их основной бизнес.

Короче говоря, если бы я был на вашем месте, я бы еще раз посмотрел на что-то вроде Akismet. Если вы встроите на свой сайт средство, с помощью которого вы или ваши пользователи сможете помечать сообщения как спам (например, с помощью метода spam! rakismet), вы сможете отправлять эти данные в akismet, и служба должна довольно быстро узнать, что определенный тип сообщение является спамом. Таким образом, если ваши пользователи отправляют много похожих спам-сообщений, даже если akismet не улавливает это сразу, после того, как вы отметите пару из них, все остальные должны быть обнаружены автоматически. На вашем месте я бы сосредоточил свои усилия на экспериментах в этом направлении, а не на попытках создать собственное решение.

person skorks    schedule 13.08.2011
comment
Спасибо за длинный ответ! Я пропустил, что rakismet включает в себя способ обозначить что-то как спам с помощью метода spam!, на который вы ссылались. Однако меня беспокоит одна вещь: скажем, пользователь отправляет очень простое сообщение, например: привет, очень многим людям. Если это будет помечено как спам, помешает ли это людям отправлять простые приветственные сообщения в дальнейшем? Я бы предпочел пропустить несколько спам-сообщений, чем иметь кучу ложных срабатываний, которые мешают кому-то отправить законное сообщение. - person Matt Huggins; 13.08.2011
comment
Это факт, что любая классификация спама (или классификация в целом) работает намного лучше с более длинным контентом. Тем не менее, akismet занимается своим делом уже много лет, и, как я уже сказал, у них много данных, вероятно, потребуется немало усилий, чтобы навсегда пометить такое сообщение как спам. Мой совет: идите с akismet, вы удивитесь, насколько хорошо они делают то, что делают. Если вы действительно беспокоитесь, поместите фасад перед akismet, чтобы вы могли легко заменить его чем-то другим, не слишком сильно влияя на ваш код. - person skorks; 13.08.2011