Алгоритм антиспам
Создавая формы для восстановления пароля или формы для комментариев, в которые обычные зарегистрированные пользователи могут передавать различные данные, мы должны всегда учитывать один момент: а что, если пользователь напишет скрипт (допустим 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 внутри блока. Проблема в том, что если мы задаем данное свойство, то оно начинает действовать на всю область окна, а это не всегда то, что нужно.