Уклоняемся от басурманского спама. Evo.

В последнее время че-та слишком много басурманского спама начало падать мне в почту, в итоге психанул и написал небольшое дополнение для eForm, которое не только блокирует отправку спама, но и кидает ip в глубокий бан. Проверка достаточно проста — если нет русских букаф — значит злодей.

Итак. Сначала создаем табличку. Если кто не в курсе, то в Evolution есть возможность производить запросы из админки, для этого идем по цепочке: Инструменты -> Резервное копирование -> Восстановить -> Выполнить произвольную команду SQL.

Вставляем — выполняем. (префикс здесь не важен, но можете поменять на свой).

CREATE TABLE IF NOT EXISTS `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 DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;

После этого идем в плагины и созадем плагинчик на 'OnBeforeLoadDocumentObject' и 'OnLoadWebPageCache'.

//<?php 
$e = $modx->Event;
$ip = $_SERVER["REMOTE_ADDR"];
$tbl = $modx->getFullTableName('ip_blocked');
if ($modx->db->getValue("Select count(*) from $tbl where `ip`='$ip'")==1)
{
exit('С вашего IP производилась попытка отправки спама. Ваш адрес занесен в черный список. From your IP was trying to send spam. Your address is listed in Carini list.'); 
}
if ($e->name == 'OnBeforeLoadDocumentObject' || $e->name == 'OnLoadWebPageCache')
{ 
if ($_POST['validate'])
{
if ((!preg_match('/[а-яА-Я]{1,}/', $_POST[$_POST[validate]])) or (!isset($_POST[$_POST[validate]])))
{
$modx->db->insert(array('ip'=>$ip,'blocked'=>1,'when'=>time()),$tbl);
exit('Ваше сообщение подозрительно похоже на спам. Поэтому его отправка была отклонена, а ваш IP занесен в черный список. Your message sounds suspiciously like spam. Therefore, his submission was rejected and your IP blacklisted.');
} 
} 
}


Ну а теперь для того, чтобы указать какое именно поле проверять вставляем в форму скрытый инпут с именем validate и значением в виде имени проверяемого поля. Допусти, если мы хотим проверять по полю message, то вставляем такую строчку в форму.

<input type="text" name="validate" value="message" style="display:none;"/>

Обратите внимание: не type=«hidden», а style=«display:none;». Это связано с тем, что eForm не любит скрытые поля кроме идентификатора формы.

comments powered by HyperComments