Алгоритм антиспам

  • 23 июля 2017
  • 777
0%

Помогло?

Создавая формы для восстановления пароля или формы для комментариев, в которые обычные зарегистрированные пользователи могут передавать различные данные, мы должны всегда учитывать один момент: а что, если пользователь напишет скрипт (допустим php curl), который в цикле совершит 100, 1000, 100000 запросов и либо "заспамит" почтовой рассылкой пользователя, либо накидает бессмысленных сообщений в нашу базу.

Бороться с этим можно. Один из вариантов - использовать captcha, и это решение отлично работает, за исключением одного НО: она делает наш интерфейс немного сложнее для пользователя. Пользователю приходится “напрягаться”, чтобы распознать информацию, либо собрать мозаику ассоциаций, что не всегда удается с первого раза. 

Есть еще одно решение, которое, можно сказать, является моим ноу-хау. Уверен, что я не первый, на просторах интернета есть что-то похожее, но мне лень гуглить ;) Смысл такой: когда пользователь отправляет данные (допустим емайл на восстановление пароля), мы дружелюбно выполняем все его прихоти, только при одном условии - создаем cache_key, сгенерированный ключ, который по факту записывается в кэш, например, следующие данные: cache_key_<user_ip>_<email>.

Придумать можно массу различных ключей, храним его в районе 1 часа. Таким образом, при повторном запросе к данному емайлу с этого IP адреса будет выдана ошибка, значит пользователь уже не сможет атаковать чей-то емайл, конечно, он может сменить IP, используя прокси, но это затратно и сложно, в общем, "заспамить" сильно не удасться. 

По аналогии можно создать ключ и для добавления комментариев неавторизованным пользователям в гостевую книгу. Ключ будет иметь примерно такой вид: cache_key_127.0.0.1_article26_mess37, время можно выставить на 15 или на 30 минут. Теперь при повторной отправки сообщения будет выдана ошибка. Если пользователь ответил на данное сообщение, то кэш-ключ можно удалить, чтобы пользователь мог ответить. Как видите, логику вы сможете прописать любую. 

И теперь пример реализации на Yii2 фрэймворке: 

<?php
private function _checkCacheKey()
{
	$ip = $_SERVER['REMOTE_ADDR'];
	$cache = Yii::$app->cache;
	$cache_key = 'cache_key'.$ip;
		// $cache->delete($cache_key); # очистить кэш если нужно
	if ($cache->get($cache_key) == false) {
		$cache->set($cache_key, $ip, 3600);
		return true;
	} else {
 		return false;
	}
}

function sendPass(){
	if($this->_checkCacheKey()){
		//.. что-то тут делаем
	}else{
		//.. выводим сообщение об ошибке
	}
}

Вот таким простым способом мы смогли побороться со спам сообщениями на сайте, при этом не усложняя наш программный интерфейс.

Облако тегов

Следующая статья

CSS: Position fixed внутри блока

Иногда требуется сделать так, чтобы элемент принимал position:fixed внутри блока. Проблема в том, что если мы задаем данное свойство, то оно начинает действовать на всю область окна, а это не всегда то, что нужно.

Сообщения: (0)

?
Публикуя сообщение, вы соглашаетесь с пользовательским соглашением

Читайте также