Установка 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> </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('Ваши действия похожи на автоматические, форма обратной связи недоступна');
Комментариев нет