В последнее время че-та слишком много басурманского спама начало падать мне в почту, в итоге психанул и написал небольшое дополнение для 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 не любит скрытые поля кроме идентификатора формы.