Защита сайта от поведенческих AI и SPAM-ботов с помощью Cloudflare Turnstile
Не заставлять человека доказывать, что он не робот, а позволить сайту незаметно убедиться, что перед ним действительно человек. Без головоломок, без кликов по картинкам, без заметной задержки — и при этом с очень достойным уровнем защиты даже от самых продвинутых ферм поведенческих ботов 2025–2026 годов.
Как внедрить Turnstile на сайт.
Вот актуальная (на январь 2026 года) инструкция по внедрению Cloudflare Turnstile на любой сайт — пошагово и максимально практично.
Создаём виджет в Cloudflare
- Заходите в аккаунт Cloudflare → боковое меню → Turnstile
(или сразу сюда: https://dash.cloudflare.com/ → Turnstile) - Нажимаете Add widget / Добавить виджет
- Заполняете:
- Widget name — любое понятное вам название
- Hostname — домен сайта (можно несколько через запятую)
- Widget mode — выбираете один из вариантов:
|
Режим
|
Видимость
|
Когда лучше использовать
|
|
|---|---|---|---|
|
Non-interactive
|
почти невидимый
|
максимальная незаметность, средний/высокий трафик
|
|
|
Managed
|
появляется чекбокс при подозрении
|
золотая середина 2025–2026
|
|
|
Invisible
|
полностью скрыт
|
самая высокая незаметность, но чуть слабее защита
|
Рекомендация на 2026 год: Managed — лучший баланс защита/удобство в большинстве случаев.После создания вы получите две важные строки:
- Site Key (публичный)
- Secret Key (секретный — только на сервер!)
<?php
session_start();
$siteKey = 'ВАШ_SITE_KEY';
$secretKey = 'ВАШ_SECRET_KEY';
$tokenLifetime = 14400; // 4 часа
// Получаем исходный URL, куда нужно вернуться после проверки
$returnUrl = $_GET['return'] ?? 'index.php';
// Если токен уже действителен — сразу перенаправляем
if (isset($_SESSION['turnstile_valid']) && $_SESSION['turnstile_valid'] > time()) {
header('Location: ' . $returnUrl);
exit;
}
// Обработка отправки капчи
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$token = $_POST['cf-turnstile-response'] ?? '';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://challenges.cloudflare.com/turnstile/v0/siteverify');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query([
'secret' => $secretKey,
'response' => $token,
'remoteip' => $_SERVER['REMOTE_ADDR']
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
curl_close($ch);
$json = json_decode($result, true);
if ($json['success'] === true) {
$_SESSION['turnstile_valid'] = time() + $tokenLifetime;
header('Location: ' . $returnUrl);
exit;
} else {
$error = 'Проверка не пройдена. Попробуйте ещё раз.';
}
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<title>Защита контента</title>
<script src="https://challenges.cloudflare.com/turnstile/v0/api.js" async defer></script>
<style>
body { font-family: Arial, sans-serif; text-align: center; margin-top: 100px; }
.container { max-width: 400px; margin: 0 auto; }
</style>
</head>
<body>
<div class="container">
<h1>Одну секунду!</h1>
<p>Мы убедимся, что вы не бот.</p>
<?php if (isset($error)): ?>
<p style="color: red;"><?php echo htmlspecialchars($error); ?></p>
<?php endif; ?>
<form method="post">
<div class="cf-turnstile"
data-sitekey="<?php echo $siteKey; ?>"
data-widget-type="checkbox"
data-theme="light"
data-language="ru">
</div>
<button type="submit" style="margin-top: 20px;">Продолжить</button>
</form>
</div>
</body>
</html>
Подключение защиты сайта.
<?php
session_start();
// Проверяем, прошёл ли пользователь капчу
if (!isset($_SESSION['turnstile_valid']) || $_SESSION['turnstile_valid'] < time()) {
// Сохраняем текущий URL для возврата после проверки
$currentUrl = $_SERVER['REQUEST_URI'] ?? 'index.php';
header('Location: /turnstile_check.php?return=' . urlencode($currentUrl));
exit;
}
// Остальной код страницы...
Пропускаем хороших ботов
Чтобы пропустить поисковых ботов без проверки, необходимо немного модифицировать код вызова, например так:
<?php
session_start();
// Список User-Agent поисковых ботов (можно расширить)
$botUserAgents = [
'googlebot',
'bingbot',
'yandexbot',
'duckduckbot',
'baiduspider',
'slurp', // Yahoo
'facebot', // Facebook
'twitterbot'
];
$userAgent = strtolower($_SERVER['HTTP_USER_AGENT'] ?? '');
// Если это бот — пропускаем капчу
if (isset($_SERVER['HTTP_USER_AGENT'])) {
foreach ($botUserAgents as $bot) {
if (strpos($userAgent, $bot) !== false) {
// Боту показываем контент без проверки
goto showContent;
}
}
}
// Для пользователей: проверяем сессию и редиректим на капчу
if (!isset($_SESSION['turnstile_valid']) || $_SESSION['turnstile_valid'] < time()) {
$currentUrl = $_SERVER['REQUEST_URI'] ?? '/forum/index.php';
header('Location: /turnstile_check.php?return=' . urlencode($currentUrl));
exit;
}
showContent:
// Остальной код страницы (контент сайта)
В данном материале представлено простое базовое решение для защиты вашего ресурса от нежелательного трафика. Каждый случай индивидуален и может потребовать дополнительных действий с кодом и настройками. Если вы испытываете затруднения с установкой защиты, то всегда можете обраться ко мне через страницу услуги или контакты.