reCAPTCHA сейчас, это очень важный инструмент для того, чтобы отделить мух от котлет, ботов от людей. Гугл сильно причесал reCAPTCHA 2.0, и теперь вам не надо пол часа вбивать эти нудные символы, как это было раньше на первой версии. Тыкнул по флажку и готово.
Но в документации это полезной штуки, не показано как ее валидировать через PHP и JavaScript.
Итак, сперва првоерим капчу на заполненность через JavaScript, чтобы дать пользователю возможность не отправлять по несколько раз форму, если он еще не заполнил капчу. К примеру у нас есть такая форма.
1 2 3 4 5 6 7 8 9 10 | < 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()
1 2 3 4 5 6 7 8 | < script > document.getElementById('sendForm').onsubmit = function () { if (!grecaptcha.getResponse()) { alert('Вы не заполнили поле Я не робот!'); return false; // возвращаем false и предотвращаем отправку формы } } </ script > |
Теперь форма не отправится, пока пользователь не заполнит капчу.
Чтобы вы понимали, мы сейчас не проверили капчу а всего лишь слегка улучшили интерфейс для конечного пользователя. Это надо понимать. Любой бот легко отправит эту форму на сервер, и валидировать ее нужно именно там.
Првоеряем reCAPTCHA через PHP
При отправки формы, на сервер, помимо прочего, уходит поле “g-recaptcha-response”. Его и нужно проверить. Никаких дополнительных библиотек подключать не будем. Только голый php:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?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/