Блог

Установка reCAPTCHA V3 на сайт

Прежде всего необходимо получить Ваши секретные ключи, для этого требуется перейти по ссылке https://www.google.com/recaptcha/admin/ (требуется аккаунт Google). На данной странице нужно указать название сайта, выбрать версию reCAPTCHA (в данном случае V3) и указать все домены сайта:

На следующем шаге мы получаем два секретных ключа (клиентский и серверный):

На форму обратной связи подключаем скрипт с указанием секретного ключа для клиентской части:

<script src="https://www.google.com/recaptcha/api.js?render=ваш_клиентский_ключ"></script>

После этого в форме добавляем скрытое поле для токена капчи, а так же скрипт с инициализацией капчи, здесь так же необходимо указать секретный ключ клиентской части и название действия, которое должно быть одинаковым на клиентской и серверной стороне:

<form>
	<input type="hidden" name="token" id="token">
</form>
<script>
	grecaptcha.ready(function() {
		grecaptcha.execute('ваш_клиентский_ключ', {action: 'название_действия'})
			.then(function(token) {
				if (token)
					document.getElementById('token').value = token;
			});
	});
</script>

После этого на странице в углу появится логотип reCAPTCHA, который уведомляет пользователя об использовании данной технологии:

Далее переходим к серверной проверке, здесь нам необходимо указать серверный секретный ключ, далее мы обращаемся к API и получаем результаты проверки, самостоятельно проверяем название действия (нужно чтобы оно совпало с указанным в клиентской части), если проверка пройдена успешно, то выполняем необходимое действие (например, отправка на почту), в случае если проверка не пройдена — выводим ошибку:

<?php
	if (isset($_POST['token'])) 
	{
		$captcha_token = $_POST['token'];
	} 
	else 
		die('Ошибка. Не получен токен reCAPTCHA!');
	$url = 'https://www.google.com/recaptcha/api/siteverify';
	$params = [
		'secret' => 'ваш_серверный_ключ',
		'response' => $captcha_token,
		'remoteip' => $_SERVER['REMOTE_ADDR']
	];
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$response = curl_exec($ch);
	if (!empty($response)) 
		$decoded_response = json_decode($response);
	if ($decoded_response && $decoded_response->success && $decoded_response->action == "название_действия" && $decoded_response->score > 0) 
	{
		//Действие при успешном прохождении капчи
	}
	else 
		die('Ваши действия похожи на автоматические, форма обратной связи недоступна');

Примеры, которые используются на данном сайте для формы обратной связи:

Форма:

<p style="text-align: justify;">Еcли у Вас появились вопросы или предложения Вы можете связаться со мной удобным для Вас способом:</p>
<blockquote>
	<ul>
		<li>
			<strong>email:</strong> nekiyl1@gmail.com
		</li>
		<li>
			<strong>ВКонтакте:</strong> http://vk.com/nekiyl
		</li>
	</ul>
</blockquote>
<form action="http://aliquis.ru/mail.php" method="post">
	<strong>Ваше имя:</strong>
	<br/>
	<input name="name" size="33" type="text">
	<br/>
	<br/>
	<strong>Ваш e-mail (для ответа):</strong>
	<br/>
	<input name="email" size="33" type="text">
	<br/>
	<br/>
	<strong>Ваше сообщение:</strong>
	<br/>
	<textarea cols="25" name="mess" rows="3"></textarea>
	<input type="hidden" name="token" id="token">
	<p>&nbsp;</p>
	<p><input type="submit" value="Отправить сообщение"></p>
</form>
<script src="https://www.google.com/recaptcha/api.js?render=ваш_клиентский_ключ"></script>
<script>
	grecaptcha.ready(function() {
		grecaptcha.execute('ваш_клиентский_ключ', {action: 'название_действия'})
			.then(function(token) {
				if (token)
					document.getElementById('token').value = token;
			});
	});
</script>

Серверная логика:

<?php
	if (isset($_POST['token'])) 
	{
		$captcha_token = $_POST['token'];
	} 
	else 
		die('Ошибка. Не получен токен reCAPTCHA!');
	$url = 'https://www.google.com/recaptcha/api/siteverify';
	$params = [
		'secret' => 'ваш_серверный_ключ',
		'response' => $captcha_token,
		'remoteip' => $_SERVER['REMOTE_ADDR']
	];
	$ch = curl_init($url);
	curl_setopt($ch, CURLOPT_POST, 1);
	curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	curl_setopt($ch, CURLOPT_HEADER, 0);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$response = curl_exec($ch);
	if (!empty($response)) 
		$decoded_response = json_decode($response);
	if ($decoded_response && $decoded_response->success && $decoded_response->action == "название_действия" && $decoded_response->score > 0) 
	{
		if (isset($_POST['name']))
			$name = $_POST['name'];
		if (isset($_POST['email']))
			$email = $_POST['email'];
		if (isset($_POST['mess']))
			$mess = $_POST['mess'];
		$to = "nekiyl1@gmail.com";
		$headers = "Content-type: text/plain;";
		$subject = "Сообщение с вашего сайта";
		$message = "Имя пославшего: $name \nЭлектронный адрес: $email \nСообщение: $mess";
		$send = mail ($to, $subject, $message, $headers);
		if ($send == 'true')
		{
			echo "<b>Спасибо за отправку вашего сообщения!<p>";
			echo "<a href=http://aliquis.ru/>Нажмите,</a> чтобы вернуться на главную страницу";
		}
		else
			echo "<p><b>Ошибка. Сообщение не отправлено!";
	}
	else 
		die('Ваши действия похожи на автоматические, форма обратной связи недоступна');

Комментариев нет

Ваш комментарий