Простой антиспам для CakePHP
27/11/2010

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

Решил себе приделать простенький метод борьбы со спамом от Михаила Андреева.

Смысл прост: заменяем настоящие названия полей формы на случайный набор символов, а старые поля скрываем через css.

echo $this->Form->input('34kjffe343', array('label' => __('Ваше имя', true)));
echo $this->Form->input('name', array('label' => false));

echo $this->Form->input('34f3f34f3fc34r6', array('label' => __('Ваш электронный адрес', true)));
echo $this->Form->input('email', array('label' => false));

echo $this->Form->input('458vn54jfkjm3', array('label' => __('Сайт', true)));
echo $this->Form->input('url', array('label' => false));

echo $this->Form->input('934hf9v34fhjc', array('label' => __('Комментарий', true), 'type' => 'textarea'));
echo $this->Form->input('comment', array('label' => false, 'type' => 'textarea'));
#CommentName, #CommentEmail, #CommentUrl, #CommentComment{
    display: none;
}

Дабы не менять логики контролера, немного схитрим и вспомним про метод модели beforeValidate

function beforeValidate() {
    parent::beforeValidate();
    if (!empty($this->data['Comment']['name']) || !empty($this->data['Comment']['email']) ||
        !empty($this->data['Comment']['url']) || !empty($this->data['Comment']['comment'])) {
        $this->log(array('SPAM' => $this->data['Comment']), LOG_DEBUG);
        return false;
    } else {
        $this->data['Comment']['name'] = $this->data['Comment']['34kjffe343'];
        $this->data['Comment']['email'] = $this->data['Comment']['34f3f34f3fc34r6'];
        $this->data['Comment']['url'] = $this->data['Comment']['458vn54jfkjm3'];
        $this->data['Comment']['comment'] = $this->data['Comment']['934hf9v34fhjc'];
    }
}

Если хоть одно скрытое поле заполнено - делаем invalidate для формы. На первых порах для отладки советую так же, как и я, делать запись помеченных как спам комментариев в лог. 

Спустя две недели у меня было перехвачено около 30 записей от спам-ботов.

Опубликовано в категории CakePHP | Теги: CakePHP, PHP, Заметки, Спам

Комментарии

  1. Жорик | 02-12-2010 12:14
    огромное спасибо дорогой синклер, дай бог тебе здоровья, сука
  2. IvanSCM | 23-12-2011 21:01
    Можно генерировать уникайди каждый раз новый и заносить его в сессию, а затем юзать


    <?php
    // генерация страницы
    $_SESSION['comment_id'] = uniqid('comm_', TRUE);
    // позже
    echo '<input name="'.$_SESSION['comment_id'].'">';

    //при комменте проверка на существования ключа в $_POST
    ?>


    это примитивный пример, может где и юзается

Добавить комментарий