contributte/reCAPTCHA – neodešle se formulář
- Desttro
- Člen | 126
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
Máš povolené allow_url_fopen
? Vypadá to, že se mu nedaří
poslat request (https://github.com/…Provider.php#L102).
- JonatanRek
- Člen | 20
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
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
@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.