reCAPTCHA сейчас, это очень важный инструмент для того, чтобы отделить мух от котлет, ботов от людей. Гугл сильно причесал reCAPTCHA 2.0, и теперь вам не надо пол часа вбивать эти нудные символы, как это было раньше на первой версии. Тыкнул по флажку и готово.
Но в документации это полезной штуки, не показано как ее валидировать через PHP и JavaScript.
Итак, сперва првоерим капчу на заполненность через JavaScript, чтобы дать пользователю возможность не отправлять по несколько раз форму, если он еще не заполнил капчу. К примеру у нас есть такая форма.
<form id="sendForm" action="mail.php" method="post" enctype="multipart/form-data"> <input required name="sender_name" placeholder="Ваше имя..."/> <input required name="sender_email" placeholder="Ваш email..."/> <textarea required placeholder="Ваше сообщение" name="sender_message"> <div class="captcha_wrapper"> <script src='https://www.google.com/recaptcha/api.js'></script> <div class="g-recaptcha" data-sitekey="YOUR__PUBLIC_KEY"></div> </div> <button type="submit" id="send_message">Отправить</button> </form>
YOUR_PUBLIC_KEY
вы возьмете отсюда https://www.google.com/recaptcha/intro/index.html, там же будет и YOUR_SECRET_KEY
упомянутый ниже.
В ней будет выведена recapcha, но при нажатии на кнопку отправки, браузер попросит заполнить все поля, так как у них стоит атрибут required
, но рекапча отправится не заполненной. Мы разумеется проверим ее на сервере, но и до этого лучше дать возможность юзеру не делать лишних движений, а сразу дать ему понять что он что-то забыл. Делается это при помощи метода grecaptcha.getResponse()
<script> document.getElementById('sendForm').onsubmit = function () { if (!grecaptcha.getResponse()) { alert('Вы не заполнили поле Я не робот!'); return false; // возвращаем false и предотвращаем отправку формы } } </script>
Теперь форма не отправится, пока пользователь не заполнит капчу.
Чтобы вы понимали, мы сейчас не проверили капчу а всего лишь слегка улучшили интерфейс для конечного пользователя. Это надо понимать. Любой бот легко отправит эту форму на сервер, и валидировать ее нужно именно там.
Првоеряем reCAPTCHA через PHP
При отправки формы, на сервер, помимо прочего, уходит поле “g-recaptcha-response”. Его и нужно проверить. Никаких дополнительных библиотек подключать не будем. Только голый php:
<?php $response = $_POST["g-recaptcha-response"]; $url = 'https://www.google.com/recaptcha/api/siteverify'; $data = [ 'secret' => 'YOUR_SECRET', 'response' => $_POST["g-recaptcha-response"] ]; $options = [ 'http' => [ 'method' => 'POST', 'content' => http_build_query($data) ] ]; $context = stream_context_create($options); $verify = file_get_contents($url, false, $context); $captcha_success=json_decode($verify); if ($captcha_success->success==false) { echo "Ты робот! Не люблю тебя!"; } else if ($captcha_success->success==true) { // сохраняем данные, отправляем письма, делаем другую работу. Пользователь не робот }
Комментарии
http://phpjs.ru/2017/07/18/google-captcha-v2/