Поддержать Проект

Обратная связь

[MODX] Guru
  • Информация
  • Разработчикам
  • Дополнения
    • DocLister
    • DLMenu
    • DLCrumbs
    • DLBuildMenu
    • DLLastViews
    • DLSiblings
    • DLRequest
    • DLglossary
    • DLSitemap
    • DocInfo
    • FormLister
    • Wayfinder
    • phpthumb
    • LikeDislike
    • eForm
    • Ditto
    • multiTV
    • AjaxMegaSearch
    • AjaxSearch
    • WebLoginPE
    • Breadcrumbs
    • CodeMirror
    • AnythingRating
    • Easy Newsletter
    • FirstChildRedirect
    • OpenGraphTags
    • ddTypograph
    • TagSaver
    • BlackList
    • CfgTv
    • ModxAccount
    • Forgot Manager Login
    • GetField
    • if
    • Jot
    • ListChild
    • ListIndexer
    • ManagerManager
    • ddMMEditor
    • MaxiGallery
    • MemberCheck
    • ddGetMultipleField
    • MetaX
    • MODxBB и phpBB
    • Yams
    • Personalize
    • PHx
    • Reflect
    • tagLinks
    • TransAlias
    • TvTagCloud
    • UltimateParent
    • WebSignup
    • WebLogin
    • countViews
    • thumb
    • imageCaptor
    • optimizeJPG
    • Preview Next
    • Shopkeeper
    • SiteMap
    • Sass
    • Selector
    • SimpleGallery
    • SimpleTube
    • SimpleFiles
    • Star Rating
    • MinifyX
    • adminNav
    • SimplePolls
    • CResource
    • MODxAPI
    • customTables
    • HtmlInLine
    • HtmlMinModxEvo
    • SHKUserProfile
    • PickDocsInTree
    • evoSearch
    • editDocs
    • PageBuilder
    • HybridAuth
    • Compare
    • alterTitle
  • Виджеты
  • Уроки
  • Разработчики
  • Готовые примеры
  • Блог
  • Конфиги
  • HTML коды
© [MODX] Guru
  • Дополнения

BlackList: Защита от спама без каптчи

  • Дополнения
  • BlackList
1482

BlackList: Защита от спама без каптчи

Пример используя платного веб-сервиса Akismet

Автор: Алексей Либер

Первое, что надо сделать – зарегистрироваться на сайте 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!');
			}
		}
}