Защищаем Wordress от перебора паролей с помощью Fail2Ban

fail2ban_and_wordpressНаверно, самым простым и действенным методом от перебора паролей является установка капчи. Но я как то не проникся идеей ее установки и решил задействовать более тяжелую артиллерию, а именно защитить от брутфорса с помощью Fail2Ban (Примечание: инструмент позволяющий защитить сервер от брутфорса таких сервисов как SSH, FTP, Apache и т.д). Fail2Ban не привязан к каким то конкретным сервисам. Блокировка происходит на основании шаблонов, которые определяются в файлах конфигурации. Fail2Ban в реальном времени отслеживание изменения в логах и, при появлении строки из объявленного шаблона, блокирует IP-адрес и высылает отчет на почту админу.

Поскольку добрые люди уже поработали надо дополнением к WordPress,- нам останется его только чуть допилить Fail2Ban для нашей системы. Итак, сначала установите в WordPress дополнение WP fail2ban, либо скачав и установив его «вручную», либо напрямую из раздела Плагины → Добавить новый.

Все действия я произвожу для системы с установленной CentOS x64

(далее…)

Как избавиться от спама в WordPress раз и навсегда

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

Итак, первое что я сделал — это удалил все плагины с Capcha, блокированием по черным спискам и прочую неработающую фигню. Они нам больше никогда не понадобятся, а если и понадобятся — это только при регистрации.

В 99% случаев спамеры отправляют url своих ресурсов. От этого то и будем отталкиваться. В одной из предыдущих заметок я уже рассказывал, что убрал из формы отправки комментария параметр «Сайт». Так вот, спамеры все равно отправляют этот параметр заполненным в своем POST запросе. Этим то мы и воспользуемся. Если есть параметр ‘url’ — шлем спамера «подальше». Также я заметил, что спамеры в качестве текста комментария используют заголовок темы, потому если коммент будет совпадать с заголовком — шлем спамера «еще дальше».

И теперь самое главное — добавим в форму комментария свое поле, которое обязательно для заполнения. К примеру я использовал простое текстовое поле с просьбой ввести от пользователя url своего блога.

Открываем файл wp-includes/comment-template.php и ищем в нем функцию comment_form. В ней находим блок

 $fields =  array(
                'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
                'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',

В этот массив добавляем наше поле АнтиСпам.  В конечном счете оно выглядит так:

       $fields =  array(
                'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="author" name="author" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . ' /></p>',
                'email'  => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="email" name="email" type="text" value="' . esc_attr(  $commenter['comment_author_email'] ) . '" size="30"' . $aria_req . ' /></p>',
                'spam'  => '<p class="comment-form-spam"><label for="spam">' . __( 'Antispam: please enter voip-lab.ru' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
                            '<input id="spam" name="spam" type="text" value="' . esc_attr(  $commenter['comment_author_spam'] ) . '" size="30"' . $aria_req . ' /></p>');

Далее нам будет необходимо обработать новое поле spam. Для этого открываем файл wp-comments-post.php в корне движка WordPress и находим блок

} else {
        if ( get_option('comment_registration') || 'private' == $status )
                wp_die( __('Sorry, you must be logged in to post a comment.') );
}

И сразу после него добавляем наш код, котором, если пользователь не авторизован,  будет происходить проверка что он не спамер

if ( !is_user_logged_in() ) {
    if($comment_spam!='voip-lab.ru') wp_die( __('If you are not spamer go back and set text field Antispam to voip-lab.ru.') );
    if($comment_author_url!='') wp_die( __('You are fucking spamer.') );
    if($comment_content == get_the_title($post)) wp_die( __('You are fucking spamer.') );
}

Далее необходимо отключить trackback, т.к. очень много спама валится через него. Долго искать решение не пришлось. В корне сайта просто удаляем или переименовываем файл wp-trackback.php.

На этом настройка своей АнтиСпам системы закончена. Приведу немного статистики — когда я использовал капчи и другие плагины, я удалял порядка 300-400 спам сообщений в день. В моем решении мне не пришло ни одного сообщения от спамеров. Скажем им «гуд бай» =)

Как убрать сайт из комментариев WordPress

Небольшая заметка в мемы. Открываем файл wp-includes/comment-template.php и ищем функцию comment_form. В ней находим объявление массива $fields. И удаляем элемент url, не забывая при этом про скобки и запятые. Вот как было у меня:

$fields =  array(
                'author' => '

‘ . ‘ ‘ . ‘

‘, ’email’ => ‘

‘, ‘url’ => ‘

‘ . ‘

‘, );

Вот как стало:

$fields =  array(
                'author' => '

‘ . ‘ ‘ . ‘

‘, ’email’ => ‘

‘ );

Сохраняем файл и радуемся =)

Локализация темы WordPress

Codestyling

После активации плагина в боковом меню консоли в меню «Инструменты» появляется пункт «Локализация». Переходим туда.

Localization

Если у русифицируемой темы нет русского языка, жмём «Добавить новый язык» и выбираем русский. Теперь в появившейся строке русского языка выбираем «Сканировать» и  в появившемся окне жмём кнопку «сканировать», а затем «завершить». Теперь в строке русского языка жмём «Редактировать». Появляется список фраз и переводов для них.

Снимок экрана 2013-03-26 в 15.54.31

Каждую фразу можно редактировать, нажав соответствующую ссылку напротив неё. Во многих фразах присутствуют динамически подставляемые параметры, которые обозначаются как «%s», которые должны присутствовать и в переводе. Не обязательно переводить все фразы, можно лишь самые необходимые. После перевода жмём кнопку «генерировать mo-файл» (над списком фраз) и наслаждаемся результатом.

После русификации всех нужных тем и плагинов, плагин «CodeStyling Localization» можно деактивировать и даже удалить. Все созданные .po .mo файлы останутся.