Защита от спама форума SMF 1.1.x, часть 2

Дата: 31 августа, 2010 год

В первой части (дада, она оказалось первой, после того как появилась вторая:)) я вроде бы поставил точку на теме защиты от спама форума SMF. Однако, как показала практика и время, не все так радужно, и мне снова пришлось взяться за эту проблему.

Описанный ранее мод reCAPTCHA for SMF выдает свою каптчу только при регистрации, а грязный хак, что описывается в конце первой части, спокойно пропускает сообщения, во1, без URL, во2, сообщения с неактивными URL (некликабельными).

Для чего спамерам постить сообщения без ссылок? есть 2 причины:

  1. Ссылку можно поставить в профиле после регистрации (но т.к. у нас на регистрации стоит reCAPTCHA, беспокоиться не о чем)
  2. Спамер проверяет, модерируется ли форум, а также индексируется ли он. То есть, спам-бот постит случайный набор символов, а потом через недельки две проверяет. Если этот случайный набор находится в поисковике, и на форуме он по-прежнему находится, значит, на этот форум можно постить ссылки.

В последнее время “проверяющих” сообщений стало ну просто дофигища, и я засел за проблему. Залез в моды для SMF, увидел, что ничего с прошлого моего захода не поменялось, и понял, что нужно делать свой хак. Решение пришло быстро – добавить в форму ответа простой checkbox, отмечая который реальные посетители будут идентифицировать свою реальность :)

Итак, нужно поменять и добавить кода в следующие файлы:

  1. в файл Display.template.php после
    
    ';
    

    добавить код:

    
    if ($context['user']['is_guest']) {
    
        echo '
    Имя
    E-mail
    ', $txt['no_spam'], '
    '; }

    Данный код добавить к быстрому ответу, во1, имя и email (которые почему-то отсутствуют), а во2 – тот самый checkbox.

  2. в файл Post.template.php перед
    
    // Are you posting a calendar event?
    

    добавить код:

    
    if ($context['user']['is_guest']) {
    
        echo '
    ', $txt['no_spam'], '
    
    ';
    
    }
    

    Этот код добавит checkbox в форму расширенного ответа.

  3. в файл Post.php (папка sources) после
    
    $post_errors[] = 'long_name';
    

    добавить код:

    
    if (!$_POST['chicken']) $post_errors[] = 'spamer';
    

    Собственно, добавляем само действие – если checkbox не отмечен – возвращаем ошибку.

  4. в файл Errors.russian-utf8.php добавить в конец строку:
    
    $txt['error_spamer'] = 'Вы забыли поставить галочку напротив "Я не спамер"';
    

    в файл index.russian-utf8.php добавить в конец строку:

    
    $txt['no_spam'] = 'Я не спамер';
    

    А это сообщения и надписи, которые будут выводиться

Вот, собственно, и все.. template-файлы лежат либо в папке /Themes/ваша_тема/, либо в папке /Themes/Default/

Вот так это выглядит в быстром ответе:

А вот так происходит сообщение об ошибке при непоставленной галочке:

Замечу, что эта проблема возникла с форумом, где гости имеют право постить без регистрации!. В случае, когда это запрещено, все намного проще, спасает reCAPTCHA

Leave a Reply