Для последних из Могикан тех, кто всё ещё пользуется первой веткой.
Покажу, как я организовал показ капчи пользователям. То есть, не показ капчи при отправке формы (это и так присутствует), а повесил капчу на весь сайт. То есть пользователь открывает сайт и первое что он видит, предложение ввести капчу. Если ввёл успешно попадает туда куда хотел изначально, если не ввёл идёт лесом.
Зачем это нужно? В каких случаях это нужно? Нужно ли это вообще? Каждый решает сам для себя. У меня есть свой список критериев, при совпадении которых я направляю пользователей на капчу. Все их раскрывать не буду, у каждого они свои. Покажу лишь общий принцип организации такой капчи на примере пользователя у которого ip 6, с таких айпишников сейчас много не полезных ботов шляются по сайтам. К этому критерию можно добавить какие то свои.
1. В файле index.php в начале добавляем
//проверяем проходил ли этот пользователь капчу раньше $seccaptcha = $_COOKIE['scaptcha']; //проверка на IPv6 $is_ip6 = 0; if($is_ip_bytes == 16){ $is_ip6 = 1; } //при совпадении некоторых условий... //1. у пользователя IPv6 //2. не проходил капчу ранее //можно проверить пользователя на другие факторы и добавить условие, например, выводить капчу в определённом разделе: && $_SERVER['REQUEST_URI'] == '/board' if($is_ip6 && !$seccaptcha){ //...запоминаем страницу куда хотел попасть пользователь... //...и отправляем для начала пройти капчу } //если пользователь пытается вернуться со страницы капчи но не прошёл её показываем ошибку 404 if($_SERVER['HTTP_REFERER'] == 'https://mysite.ru/captcha.php' && !$seccaptcha){ }
2. В корне сайта создаём файл captcha.php с таким содержимым
<?php //проверяем откуда пришёл пользователь $fromPage = $_COOKIE['fpage']; //если он был сюда есть страница куда его следует вернуть if($fromPage){ //пдключаемся к системе include(PATH.'/core/cms.php'); include(PATH.'/core/classes/page.class.php'); cmsCore::getInstance(); cmsCore::loadClass('user'); //$inDB = cmsDatabase::getInstance(); $inPage = cmsPage::getInstance(); //функция для проверки капчи которая используется в других местах системы function checkCaptcha() { $captcha_id = cmsCore::request('captcha_id', 'str', ''); $captcha_code = cmsCore::request('captcha_code', 'str', ''); $real_code = $_SESSION['captcha'][$captcha_id]; return ($real_code === $captcha_code); } $captcha_id = cmsCore::request('captcha_id', 'str', ''); $captcha_code = cmsCore::request('captcha_code', 'str', ''); if($captcha_id && $captcha_code){ $capcha_res = checkCaptcha(); } //если проверка капчи прошла успешно if($capcha_res){ //запоминаем факт прохождения капчи пользователем на месяц //возвращаем на нужную страницу } //если неизвестно на какую страницу нужно возвращать пользователя } else { //показываем ошибку 404 } ?> <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <script type="text/javascript" src="/includes/jquery/jquery.js"></script> <link href="/styles.css" rel="stylesheet" type="text/css" /> </head> <body> <div align="center" style="width:100%;"> <div align="left" style="width:100%; max-width:500px; box-sizing:border-box; padding:10px;"> <div style="border-bottom:2px solid blue; margin-bottom:20px; padding:20px 0; ">Текст, который объясняет пользователю необходимость ввести капчу</div> <form method="post" action=""> <div><?php echo cmsPage::getCaptcha(); ?></div> <div style="clear:both;"><br><input type="submit" value="Отправить"></div> </form> </div></div> </body> </html>
Остальные пояснения в комментариях к коду.
Домен сайта и текст приветствие меняем на свои.
У меня работает, но возможно что-то упустил, когда адаптировал свой код для блога, если не работает как должно, можете сообщить.
При проверке на рабочем сайте используйте вкладку инкогнито в браузере или очищайте куки
Реклама #
Нил™ 11 месяцев назад #
Да, главное не перестараться и не направить на капчу поисковых ботов) в текущем виде — этого не должно происходить
Вадим Сибыч 11 месяцев назад #
Б — безопасность. 😂