Yvision.kzYvision.kz
kk
Разное
Разное
399 773 постов41 подписчиков
Всяко-разно
1
22:10, 01 октября 2010

Алгоритм шинглов - боремся со спамом на сайте

15 октября прошлого года я принял участие в Яндекс.Субботнике, проходившем в Алматы. При общении в кулуарах один из программистов Яндекса обмолвился, что для борьбы со спамом в почте используется Алгоритм Шинглов. Тогда я не придал этому особого значения, но про себя отметил, что это прекрасная идея.

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

Конечно же, у меня были инструменты для блокирования комментаторов по IP и для удаления комментариев. Но этого было недостаточно, поскольку спам шёл с разных IP. Чёткие шаблоны создавать тоже не получалось, потому что текст спама немного отличался каждый раз.

И тут я вспомнил про алгоритм шинглов. В базе я создал таблицу spam_shingles, состоящую из двух полей - text_id (unsigned integer) и shingle_hash (integer). В поле text_id я записываю id комментария, а в shingle_hash - crc32 от всех шинглов (длиной в 2 слова) этого комментария. После этого сам комментарий удаляю.

При добавлении комментария я сверяюсь с таблицей spam_shingles запросом SELECT COUNT(*) AS intersects FROM spam_shingles GROUP BY text_id и если intersects>0, значит комментарий является спамом.

Конечно, такая схема не исключает ложных срабатываний, но на практике за полгода использования их ещё не было (каждый комментарий, признанный спамом попадает в лог). Также эту схему я по долгу службы внедрил на сайте Zakon.kz и по велению сердца на своём каталоге сайтов.

Ps: Если будет интересно, могу опубликовать свою реализацию разбивки текста на шинглы на PHP.

1
686
1