Задать вопрос

Возможна ли как альтернатива cloudflare применение recaptcha google?

Добрый день

У меня на сайте появилось очень большая посещаемость, по логам видно что это робот или бот. Задался я вопросом, можно ли использовать капу гугла как альтернативу cloudflare для защиты. Кажется возможно, вот такой есть рабочий код. Он не выводит капчу для роботов Яндекса и Гугла, а для остальных просит пройти капчу. Конечно посещаемость сильно упала, но заходят точно люди. Проверка ответа сервера и кода поискового робота яндекса показывает что все норм на веб мастере.

Но я решил задать вопрос, можно ли так делать не в ущерб сайту?
Есть кто то опытный в этом вопросе?

// Функция проверки роботов Яндекса и Google
function is_yandex_or_google_bot() {
    $user_agent = $_SERVER['HTTP_USER_AGENT'];
    $ip_address = $_SERVER['REMOTE_ADDR'];

    // Проверка User-Agent для Googlebot (включая домены googlebot.com, google.com, googleusercontent.com)
    if (stripos($user_agent, 'Googlebot') !== false) {
        $google_domains = ['googlebot.com', 'google.com', 'googleusercontent.com'];
        foreach ($google_domains as $domain) {
            if (substr($user_agent, -strlen($domain)) === $domain) {
                return true;
            }
        }
    }

    // Проверка User-Agent для Яндекса (включая все роботы, заканчивающиеся на yandex.ru, yandex.net, yandex.com)
    if (stripos($user_agent, 'Yandex') !== false) {
        $yandex_domains = ['yandex.ru', 'yandex.net', 'yandex.com'];
        foreach ($yandex_domains as $domain) {
            if (substr($user_agent, -strlen($domain)) === $domain) {
                return true;
            }
        }
    }

    // Проверка IP-адресов
    $yandex_ips = ['77.88.55.50', '77.88.55.51', '77.88.55.55'];
    $google_ips = ['66.249.64.0/19', '66.102.0.0/20', '74.125.0.0/16'];

    foreach ($yandex_ips as $ip) {
        if ($ip_address === $ip) {
            return true;
        }
    }

    foreach ($google_ips as $ip_range) {
        if (ip_in_range($ip_address, $ip_range)) {
            return true;
        }
    }

    return false;
}

// Функция для проверки, является ли IP-адрес IPv6
function is_ipv6($ip) {
    return filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6);
}

function ip_in_range($ip, $range) {
    list($range, $netmask) = explode('/', $range, 2);
    $range_decimal = ip2long($range);
    $ip_decimal = ip2long($ip);
    $wildcard_decimal = pow(2, (32 - $netmask)) - 1;
    $netmask_decimal = ~$wildcard_decimal;
    return (($ip_decimal & $netmask_decimal) == ($range_decimal & $netmask_decimal));
}

// Блокировка до прохождения капчи
function captcha_protection_init() {
    if (is_admin() || wp_doing_ajax()) {
        return;
    }

    // Проверка, является ли пользователь ботом Яндекса или Google
    if (is_yandex_or_google_bot()) {
        return;
    }

    // Получаем IP-адрес пользователя
    $ip_address = $_SERVER['REMOTE_ADDR'];

    // Если IP-адрес IPv6, показываем капчу сразу
    if (is_ipv6($ip_address) && !isset($_COOKIE['captcha_passed'])) {
        require_once('captcha-page.php');
        exit;
    }

	//капча только для новых пользователей с IPv6 проверка на наличие куки
	if (is_ipv6($ip_address) && !isset($_COOKIE['captcha_passed'])) {
	    require_once('captcha-page.php');
	    exit;
	}

    // Инициализация счетчика посещений
    $visit_count = isset($_COOKIE['visit_count']) ? intval($_COOKIE['visit_count']) : 0;

    // Увеличение счетчика посещений
    $visit_count++;

    // Установка cookie с новым значением счетчика
    setcookie('visit_count', $visit_count, time() + 86400, '/'); // Cookie на 24 часа

    // Проверка, превышено ли количество посещений
    if ($visit_count > 5 && !isset($_COOKIE['captcha_passed'])) {
        require_once('captcha-page.php');
        exit;
    }
}
add_action('init', 'captcha_protection_init');

// Обработчик проверки капчи
function verify_recaptcha() {
    $secret_key = 'секретный ключ';
    $response = $_POST['g-recaptcha-response'];

    $verify = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret={$secret_key}&response={$response}");
    $captcha_result = json_decode($verify);

    if ($captcha_result->success) {
        // Устанавливаем cookie, что капча пройдена
        setcookie('captcha_passed', 'true', time() + 86400, '/');
        
        // Сбрасываем счетчик посещений
        setcookie('visit_count', 0, time() + 86400, '/');
        
        wp_send_json_success('Капча пройдена');
    } else {
        status_header(403);
        wp_send_json_error('Капча не пройдена');
    }
    exit;
}
add_action('wp_ajax_verify_recaptcha', 'verify_recaptcha');
add_action('wp_ajax_nopriv_verify_recaptcha', 'verify_recaptcha');


И второй файл страницы проверки
<!DOCTYPE html>
<html>
<head>
    <title>Проверка безопасности</title>
    <script src="https://www.google.com/recaptcha/api.js"></script>
    <style>
        body { 
            display: flex; 
            justify-content: center; 
            align-items: center; 
            height: 100vh; 
            font-family: Arial; 
        }
        .captcha-container {
            text-align: center;
            padding: 20px;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <div class="captcha-container">
        <h2>Подтвердите, что вы не робот</h2>
        <form id="captcha-form">
            <div class="g-recaptcha" 
                 data-sitekey="ключ сайта" 
                 data-callback="onSubmit">
            </div>
        </form>
    </div>

    <script>
    function onSubmit(token) {
        var form = new FormData();
        form.append('action', 'verify_recaptcha');
        form.append('g-recaptcha-response', token);

        fetch('<?php echo admin_url('admin-ajax.php'); ?>', {
            method: 'POST',
            body: form
        })
        .then(response => response.json())
        .then(data => {
            if (data.success) {
                window.location.reload();
            } else {
                alert('Капча не пройдена');
            }
        });
    }
    </script>
</body>
</html>
  • Вопрос задан
  • 37 просмотров
Подписаться 1 Простой 7 комментариев
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы