Капча на сайт или разделы сайта

+2
271
Капча на сайт или разделы сайта

Для последних из Могикан тех, кто всё ещё пользуется первой веткой.

Покажу, как я организовал показ капчи пользователям. То есть, не показ капчи при отправке формы (это и так присутствует), а повесил капчу на весь сайт. То есть пользователь открывает сайт и первое что он видит, предложение ввести капчу. Если ввёл успешно попадает туда куда хотел изначально, если не ввёл идёт лесом.

Зачем это нужно? В каких случаях это нужно? Нужно ли это вообще? Каждый решает сам для себя. У меня есть свой список критериев, при совпадении которых я направляю пользователей на капчу. Все их раскрывать не буду, у каждого они свои. Покажу лишь общий принцип организации такой капчи на примере пользователя у которого ip 6, с таких айпишников сейчас много не полезных ботов шляются по сайтам. К этому критерию можно добавить какие то свои.

1. В файле index.php в начале добавляем

  1. //проверяем проходил ли этот пользователь капчу раньше
  2. $seccaptcha = $_COOKIE['scaptcha'];
  3.  
  4. //проверка на IPv6
  5. $is_ip6 = 0;
  6. $is_ip_bytes = strlen(inet_pton($_SERVER['REMOTE_ADDR']));
  7. if($is_ip_bytes == 16){
  8. $is_ip6 = 1;
  9. }
  10.  
  11. //при совпадении некоторых условий...
  12. //1. у пользователя IPv6
  13. //2. не проходил капчу ранее
  14. //можно проверить пользователя на другие факторы и добавить условие, например, выводить капчу в определённом разделе: && $_SERVER['REQUEST_URI'] == '/board'
  15.  
  16. if($is_ip6 && !$seccaptcha){
  17. //...запоминаем страницу куда хотел попасть пользователь...
  18. setcookie('fpage', $_SERVER['REQUEST_URI'], time() + (86400 * 30), "/");
  19. //...и отправляем для начала пройти капчу
  20. header('Location: /captcha.php');
  21. exit();
  22. }
  23. //если пользователь пытается вернуться со страницы капчи но не прошёл её показываем ошибку 404
  24. if($_SERVER['HTTP_REFERER'] == 'https://mysite.ru/captcha.php' && !$seccaptcha){
  25. header('HTTP/1.0 404 Not Found');
  26. exit();
  27. }


2. В корне сайта создаём файл captcha.php с таким содержимым

  1. <?php
  2. //проверяем откуда пришёл пользователь
  3. $fromPage = $_COOKIE['fpage'];
  4. //если он был сюда есть страница куда его следует вернуть
  5. if($fromPage){
  6. //пдключаемся к системе
  7. define('PATH', dirname(__FILE__));
  8. define("VALID_CMS", 1);
  9. include(PATH.'/core/cms.php');
  10. include(PATH.'/core/classes/page.class.php');
  11. cmsCore::getInstance();
  12. cmsCore::loadClass('user');
  13. //$inDB = cmsDatabase::getInstance();
  14. $inPage = cmsPage::getInstance();
  15. //функция для проверки капчи которая используется в других местах системы
  16. function checkCaptcha() {
  17. $captcha_id = cmsCore::request('captcha_id', 'str', '');
  18. $captcha_code = cmsCore::request('captcha_code', 'str', '');
  19. if(!$captcha_id || empty($_SESSION['captcha'][$captcha_id]) || !$captcha_code) { return false; }
  20. $real_code = $_SESSION['captcha'][$captcha_id];
  21. unset($_SESSION['captcha'][$captcha_id]);
  22. return ($real_code === $captcha_code);
  23. }
  24. $captcha_id = cmsCore::request('captcha_id', 'str', '');
  25. $captcha_code = cmsCore::request('captcha_code', 'str', '');
  26. if($captcha_id && $captcha_code){
  27. $capcha_res = checkCaptcha();
  28. }
  29.  
  30. //если проверка капчи прошла успешно
  31. if($capcha_res){
  32. //запоминаем факт прохождения капчи пользователем на месяц
  33. setcookie('scaptcha', '1', time() + (86400 * 30), "/");
  34. //возвращаем на нужную страницу
  35. header('Location: '.$fromPage);
  36. }
  37. //если неизвестно на какую страницу нужно возвращать пользователя
  38. } else {
  39. //показываем ошибку 404
  40. header('HTTP/1.0 404 Not Found');
  41. }
  42. ?>
  43. <html>
  44. <head>
  45. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  46. <script type="text/javascript" src="/includes/jquery/jquery.js"></script>
  47. <link href="/styles.css" rel="stylesheet" type="text/css" />
  48. </head>
  49. <body>
  50. <div align="center" style="width:100%;">
  51. <div align="left" style="width:100%; max-width:500px; box-sizing:border-box; padding:10px;">
  52. <div style="border-bottom:2px solid blue; margin-bottom:20px; padding:20px 0; ">Текст, который объясняет пользователю необходимость ввести капчу</div>
  53. <form method="post" action="">
  54. <div><?php echo cmsPage::getCaptcha(); ?></div>
  55. <div style="clear:both;"><br><input type="submit" value="Отправить"></div>
  56. </form>
  57. </div></div>
  58. </body>
  59. </html>

Остальные пояснения в комментариях к коду.

Домен сайта и текст приветствие меняем на свои.

У меня работает, но возможно что-то упустил, когда адаптировал свой код для блога, если не работает как должно, можете сообщить.

При проверке на рабочем сайте используйте вкладку инкогнито в браузере или очищайте куки

0
Нил™ Нил™ 3 месяца назад #

Да, главное не перестараться и не направить на капчу поисковых ботов) в текущем виде — этого не должно происходить

0
Вадим Сибыч Вадим Сибыч 2 месяца назад #

$_COOKIE['scaptcha']

Б — безопасность. 😂

Еще от автора

Пинг поисковых систем для первой ветки
Небольшая интеграция инструментов для пингования, чтобы сделать его чуть удобнее
Генератор карты сайта в формате txt на лету без крона
Вообще то где то тут уже есть вполне рабочие генераторы карты для первой ветки, но этот вариант тоже имеет право быть.
Автопостинг с канала в Telegram в ленту активности сайта (Первая ветка)
В прошлом посте я демонстрировал схему автопостинга сообщений из ленты активности сайта на канале в Telegram.
Используя этот сайт, вы соглашаетесь с тем, что мы используем файлы cookie.