Плагин Защиты от спама без каптчи на Evolution CMS.
Автор: Алексей Либер
Первое, что надо сделать – зарегистрироваться на сайте Akismet и получить ключ API. (Там просит регистрацию на Wordpress.com, т.к. класс изначально под него заточен был). Затем перейти на страницу с плагинами и библиотеками, выбрать и загрузить класс PHP 5 Akismet.
Загруженный файлик akismet.class.php кидаем в assets/lib/
Далее создаем табличку для нежелательных ip чтобы сразу блокировать ip с которых рассылался спам.
Инструменты -> Резервное копирование -> Восстановить -> Выполнить произвольную команду SQL.
CREATE TABLE `modx_ip_blocked` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(16) NOT NULL, `blocked` tinyint(4) NOT NULL, `when` varchar(18) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), UNIQUE KEY `ip` (`ip`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Далее создаем плагин на события OnBeforeLoadDocumentObject и OnLoadWebPageCache и вставляем следующий код:
$blockip = 1; //Блокировать пользователей по ip. 1 - да. 0 - нет.
$e = $modx->Event;
if ($e->name == 'OnBeforeLoadDocumentObject' || $e->name == 'OnLoadWebPageCache'){
if ($blockip){
$ip = $_SERVER["REMOTE_ADDR"];
$tbl = $modx->getFullTableName('ip_blocked');
if ($modx->db->getValue("Select count(*) from $tbl where `ip`='$ip'") == 1){
exit('Welcome to the blacklist!');
}
}
if (($_POST['name']) || ($_POST['email']) || ($_POST['message'])){
require_once ('assets/lib/akismet.class.php');
$akismet = new Akismet('http://site.com/', '905c97472xxx');
$akismet->setCommentAuthor($_POST['name']);
$akismet->setCommentAuthorEmail($_POST['email']);
$akismet->setCommentContent($_POST['message']);
if($akismet->isCommentSpam()){
$modx->db->insert(array('ip'=>$ip,'blocked'=>1,'when'=>time()),$tbl);
exit('Welcome to the blacklist!');
}
}
}
Данная конструкция проверяет имя пользователя, его email и само сообщение. В примере выше используется имя поля message. Если у вас другое имя – поменяйте на ваше.
На момент написания поста прошло около 12-ти часов с момента установки данного решения на одном из сайтов, поймано пять писем содеражих спам, и два от клиентов доставлены адресату – т.е. вроде работает исправно.
Автор: Saniock
бесплатна
надо в ручную добавлять емаил адреса или доменные имена
Cоздаем ту же таблицу для нежелательных ip
CREATE TABLE `modx_ip_blocked` ( `id` int(11) NOT NULL AUTO_INCREMENT, `ip` varchar(16) NOT NULL, `blocked` tinyint(4) NOT NULL, `when` varchar(18) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), UNIQUE KEY `ip` (`ip`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Cоздаем таблицу в котором будем хранить емаил адреса, или подозрительные доменные имена
CREATE TABLE `modx_email_blocked` ( `id` int(11) NOT NULL AUTO_INCREMENT, `email` varbinary(50) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), UNIQUE KEY `email` (`email`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
Далее создаем плагин на события OnBeforeLoadDocumentObject, OnLoadWebPageCache, OnPageNotFound и вставляем следующий код:
$blockip = 1; //Блокировать пользователей по ip. 1 - да. 0 - нет.
$e = $modx->Event;
switch($e->name){
case 'OnBeforeLoadDocumentObject':
case 'OnLoadWebPageCache':
case 'OnPageNotFound':
$tbl_ip = $modx->getFullTableName('app_ip_blocked');
$tbl_email = $modx->getFullTableName('app_email_blocked');
if($blockip){
$ip = $_SERVER["REMOTE_ADDR"];
if($modx->db->getValue("Select count(*) from $tbl_ip where ip = '$ip'") == 1){
exit('Welcome to the blacklist!');
}
}
if($_POST['email']){
$email = $modx->db->escape($_POST['email']);
$email_domen = array_pop(explode('@', $email));
if($modx->db->getValue("Select count(*) from $tbl_email where email = '$email' or email = '$email_domen'") > 0){
$modx->db->insert(array('ip' => $ip,'blocked' => 1,'when' => time()), $tbl_ip);
exit('Welcome to the blacklist!');
}
}
}