Реализация Google reCAPTCHA на форме в Symfony 3

Что такое reCAPTCHA

reCAPTCHA — это бесплатный сервис, который защищает ваш сайт от спама и злоупотреблений. reCAPTCHA использует усовершенствованный механизм анализа рисков и адаптивные CAPTCHA, чтобы автоматизировать программное обеспечение от участия в оскорбительных действиях на вашем сайте. Это делает это, позволяя вашим действительным пользователям легко проходить через них.

reCAPTCHA не зависит исключительно от искажения текста, чтобы отделить человека от машин. Скорее, он использует передовые методы анализа рисков, учитывая все взаимодействие пользователя с CAPTCHA, и оценивает широкий спектр сигналов, которые отличают людей от ботов. ReCAPTCHA знает, когда нужно быть легким для людей и жестким для ботов. Easy CAPTCHA — легкая задача для законных пользователей.

Требования

Чтобы использовать reCAPTCHA на вашем сайте, вам необходимо:

После регистрации вашего сайта вы будете перенаправлены в админ-панель, там будут все сайты, которые у вас есть. Нажмите на тот, который вы хотите использовать.

Вы найдете меню с ключами, пример интеграции на стороне клиента и пример интеграции на стороне сервера. Обязательно сохраните ключ сайта и секретный ключ, так как они понадобятся нам позже.

Пример перепечатки ключей

Этого должно быть достаточно, чтобы справиться с интеграцией на стороне клиента.

  • Включите php-библиотеку Google recaptcha в свой проект, используя composer.

Чтобы включить php-библиотеку google recaptcha, добавьте следующую строку в файл composer.json (в свойстве require):

"google/recaptcha": "~1.1"

Или потребуйте это прямо в консоли композитора, выполнив:

композитору требуется гугл / recaptcha "~ 1.1"[/ NOEDIT]

Если вы не используете композитор, прочитайте, как установить его, используя require_once здесь.

Этого должно быть достаточно, чтобы справиться с интеграцией на стороне сервера, начнем!

Внедрение

В этом примере мы собираемся использовать простую контактную HTML-форму, вы, очевидно, можете использовать самодельную форму Symfony или форму, сгенерированную нечетким образом. Просто не забудьте добавить новое поле внутри формы.


Send message
{# or if you're using twig #}
{{form_start(form)}}
{{form_widget(form.name)}}
{{form_widget(form.subject)}}
{{form_widget(form.message)}}
{{form_widget(form.submit)}}
{{form_end(form)}}

Независимо от того, как вы делаете свою форму, просто убедитесь, что виджет находится внутри формы. Теперь виджет должен появиться в вашей форме уже без проблем, если ваше значение data-sitekey правильное и соответствует вашему сайту. С помощью captcha api этот div будет элементом формы внутри формы, он будет содержать значение, которое мы получим с помощью php в событии submit для его проверки.

Теперь вам нужно только обработать действие отправки в контроллере, на который указывает ваша форма.

Теперь ваш контроллер должен выглядеть примерно так:

use Symfony\Component\HttpFoundation\Request; // Handle the request in the controller
use ReCaptcha\ReCaptcha; // Include the recaptcha lib
public function mysubmitedAction(Request $request){
$recaptcha = new ReCaptcha('here-is-the-secret-key-that-no-one-but-you-shouldKnow');
$resp = $recaptcha->verify($request->request->get('g-recaptcha-response'), $request->getClientIp());
if (!$resp->isSuccess()) {
// Do something if the submit wasn't valid ! Use the message to show something
$message = "The reCAPTCHA wasn't entered correctly. Go back and try it again." . "(reCAPTCHA said: " . $resp->error . ")";
}else{
// Everything works good ;) your contact has been saved.
}
}

Метод проверки имеет 3 параметра, Вы можете прочитать больше о методах здесь или же проверьте документацию в официальном репозитории.

Использование макроса в Twig для визуализации поля reCAPTCHA

Обычно для пользовательского элемента в форме Symfony нам нужно создать пользовательский FormType, однако, поскольку поле reCAPTCHA на самом деле не является элементом формы (select, checkbox или radio), мы не можем сделать это таким образом. Но если вы хотите сделать свой код более удобным, вы можете создать макрос, если вы используете Twig.

Создайте новый файл ветки с именем form_elements.html.twig в App/Resources/views/Macros со следующим содержанием (если вы решили изменить путь, узнайте больше о как работает макрос в ветке):

{#app/Resources/views/Macros/form_elements.html.twig#}
{#
# The recaptcha method allow you to render a reCAPTCHA element. It expects as first parameter the site key
#}
{% macro recaptcha(siteKey)%}
{% endmacro %}

И теперь, вместо того, чтобы создавать в каждой форме div recaptcha и тег script, где он вам нужен, вы можете просто использовать в своей форме:

{% import "Macros/form_elements.html.twig" as formElements %}
{{form_start(form)}}
{{form_widget(form.name)}}
{{form_widget(form.subject)}}
{{form_widget(form.message)}}
{{formElements.recaptcha("mypublicdata-sitekey-ofthe-google-panel")}}
{{form_widget(form.submit)}}
{{form_end(form)}}

Теперь ваша форма должна быть защищена от роботов, получайте удовольствие!

Ссылка на основную публикацию
Adblock
detector