contributte/reCAPTCHA – neodešle se formulář

Desttro
Člen | 126
+
0
-

Zdravím,
chci vás poprosit, hlědám kvalitní ošetření pro formuláře proti botům, líbí se mi reCAPTCHA V3, která může fungovat v invisible režimu. Doplněk contributte/reCAPTCHA by to měl umožnit. Stabilní verze nefungovala, proto jsem switchnul na dev ~3.3.0, která se správně inicializuje:

  • v konzoli prohlížeče nejsou žádné chyby
  • vpravo dole se ukáže ikona reCAPTCHA, po najetí text „protected by reCAPTCHA“

v configu mám extension zaregistrován, sitekey a secret také, i scripty podle návodu mám:

<script src="https://www.google.com/recaptcha/api.js?render=explicit"></script>
<script src="{$basePath}/assets/invisibleRecaptcha.min.js"></script>

Ve formuláři mám:

$form->addInvisibleReCaptcha('recaptcha')
            ->setMessage('Jste opravdu člověk?');

A ve zdrojáku se na konci formuláře vygenerovalo správně:

<div class="g-recaptcha" name="recaptcha" value="XXXXXXX" data-sitekey="XXXXX" data-size="invisible"></div><input type="hidden" name="_do" value="quoteForm-submit">

Když ale formulář odešlu, stránka se pouze refreshne, není zde žádný redirect a nic se nestane.
Když odstraním z formuláře:

$form->addInvisibleReCaptcha('recaptcha')
            ->setMessage('Jste opravdu člověk?');

tak vše funguje, jak má – redirect na děkovací stránku a odeslání emailu.

Dá se tohle nějak debuggovat? Nebo v čem by mohl být prosím problém? Nebo máte někdo nějaké lepší řešení, které je inteligentní, jako reCAPTCHA a není jej nutno vždy vyplnit, jen podle scoringu uživatele?

Děkuji moc za pomoc!

uestla
Backer | 799
+
+1
-

Máš povolené allow_url_fopen? Vypadá to, že se mu nedaří poslat request (https://github.com/…Provider.php#L102).

Desttro
Člen | 126
+
0
-

Tak opravdu to bylo tím, moc děkuji za pomoc!

uestla
Backer | 799
+
0
-

Rádo se stalo.

Ještě tam píšeš, že „se nic nestane“ – vykresluješ v šabloně chyby formuláře? Měla by se vypsat tvoje hláška „Jste opravdu člověk?“.

JonatanRek
Člen | 20
+
+3
-

Dobrý den potkal mně stejný problém a však allow_url_fopen povolen mám.
pokud formulář odešlu zobrazí se hláška definovaná pro chybový stav ověření.
předem dekuji za jakoukoliv radu

Editoval JonatanRek (29. 4. 2021 10:15)

Dino
Člen | 7
+
0
-

Dobrý den, mám prosbu, Captcha je pravděpodobně funkční – tedy zobrazí formulář a načte Captcha ochranu (varianta starší Visible)
Po Sumbitu ale zobrazí hlášku a warning na řádku 66.
Undefined array key „score“
File: …\vendor\contributte\recaptcha\src\ReCaptchaProvider.php:66
Nenašel jsem nikde ve fóru, proč to vrací score a jak bych to měl ošetřit.

Neboť email se rozhodně neodešle.

56:            // Response is empty or failed
57:            if ($response === null || $response === '') {
58:                return null;
59:            }
60:
61:            // Decode server answer (with key assoc reserved)
62:            /** @var mixed[] $answer */
63:            $answer = json_decode($response, true);
64:
65:            // Return response
66:            return $answer['success'] === true && $answer['score'] >= $this->minimalScore ? new ReCaptchaResponse(true) : new ReCaptchaResponse(false, $answer['error-codes'] ?? null);

67:        }
68:
69:        public function validateControl(BaseControl $control): bool
70:        {

Vše se volá z HomePresenter.php

 protected function createComponentContactForm(): Form
    {
        $form = new Form;
        $form->addText('name', 'Jméno:')
            ->setRequired('Zadejte jméno');
        $form->addEmail('email', 'E-mail:')
            ->setRequired('Zadejte e-mail');
        $form->addText('phone', 'Telefon:')
            ->setRequired('Zadejte telefon');
        $form->addTextarea('message', 'Zpráva:')
            ->setRequired('Zadejte zprávu');
        $form->addReCaptcha('recaptcha', $label = 'Captcha', $required = TRUE, $message = 'Are you a bot?');
        $form->addSubmit('send', 'Odeslat');
        $form->onSuccess[] = [$this, 'contactFormSucceeded'];
        return $form;
    }

    public function contactFormSucceeded(stdClass $data): void
    {
        $this->facade->sendMessage($data->email, $data->name, $data->phone, $data->message);
        $this->flashMessage('Zpráva byla odeslána');
        $this->redirect('this');
    }

Prostředí – Apache/2.4.58 (Win64) OpenSSL/3.1.3 PHP/8.2.12
Captcha – contributte/recaptcha v4.0.1
Děkuji za radu

Editoval Dino (11. 1. 13:31)

nightfish
Člen | 517
+
+2
-

@Dino Stejný problém byl reportován na Slacku (https://pehapkari.slack.com/…739499467289) před třemi dny.

Kontext ze Slacku:
Dotaz: Ahoj, tak jsem dneska skončil u contributte/recaptcha v4.0.1 s hláškou Warning Undefined array key „score“ v souboru ReCaptchaProvider.php. Verze 4.0.0 to nedělá. https://github.com/…Provider.php#L66

Odpověď od Felixe: Opravíme.

…takže o problému se ví a nejspíš někdy dojde k jeho vyřešení. Jako hotfix je zřejmě možné ponížit balíček na verzi 4.0.0.