Zum Inhalt
Myra EU CAPTCHA Online-Hilfe Stand · 25.08.2026

Symfony und Laravel

Symfony und Laravel verwenden dasselbe Paket myra-security-gmbh/eu-captcha wie jede andere Anwendung mit PHP 8. Beide Rahmenwerke bringen eine eigene Ermittlung der Besucher-IP-Adresse mit, die Sie an validate() übergeben.

Voraussetzungen

Die folgenden Voraussetzungen müssen erfüllt sein:

Voraussetzung Wert
PHP ab Version 8.0
Paket myra-security-gmbh/eu-captcha
Zugangsdaten Öffentlicher Sitekey und Secret aus der Ansicht Details

Die Installation des Pakets ist unter PHP beschrieben.

Symfony

Verwenden Sie in Ihren Diensten und Controllern den Typ EuCaptchaInterface. Symfony verbindet den Dienst dann selbstständig, ohne dass Ihr Quelltext von der konkreten Klasse abhängt.

Tragen Sie den Dienst in config/services.yaml ein und verweisen Sie die Schnittstelle auf ihn:

services:
    Myrasec\EuCaptcha:
        arguments:
            $sitekey: '%env(EUCAPTCHA_SITE_KEY)%'
            $secret:  '%env(EUCAPTCHA_SECRET_KEY)%'
    Myrasec\EuCaptchaInterface: '@Myrasec\EuCaptcha'

Übergeben Sie die Schnittstelle an den Controller:

<?php

namespace App\Controller;

use Myrasec\EuCaptchaInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;

class ContactController
{
    public function __construct(private EuCaptchaInterface $captcha) {}

    #[Route('/contact', methods: ['POST'])]
    public function submit(Request $request): Response
    {
        $result = $this->captcha->validate(
            $request->request->getString('eu-captcha-response'),
            $request->getClientIp() ?? '',
        );

        if (!$result->success()) {
            return new Response('CAPTCHA verification failed', Response::HTTP_BAD_REQUEST);
        }

        // process the form...

        return new Response('OK');
    }
}

$request->getClientIp() beachtet die Einstellung der vertrauenswürdigen vorgelagerten Systeme von Symfony. Hinter einem CDN oder einem Lastverteiler erreicht damit die tatsächliche IP-Adresse des Besuchers die API. Als drittes Argument nimmt validate() zusätzlich die Kennung des Browsers entgegen.

Laravel

Legen Sie die Zugangsdaten in der Datei .env ab und veröffentlichen Sie sie über config/services.php.

Datei .env:

EUCAPTCHA_SITE_KEY=YOUR_SITEKEY
EUCAPTCHA_SECRET_KEY=YOUR_SECRET

Datei config/services.php:

'eucaptcha' => [
    'sitekey' => env('EUCAPTCHA_SITE_KEY'),
    'secret'  => env('EUCAPTCHA_SECRET_KEY'),
],

Prüfen Sie das Token im Controller:

<?php

namespace App\Http\Controllers;

use Myrasec\EuCaptcha;
use Illuminate\Http\Request;
use Illuminate\Http\RedirectResponse;

class ContactController extends Controller
{
    public function submit(Request $request): RedirectResponse
    {
        $captcha = new EuCaptcha(
            sitekey: config('services.eucaptcha.sitekey'),
            secret:  config('services.eucaptcha.secret'),
        );

        $result = $captcha->validate(
            $request->input('eu-captcha-response'),
            $request->ip(),
        );

        if (!$result->success()) {
            return back()->withErrors(['captcha' => 'CAPTCHA verification failed.']);
        }

        // process the form...

        return redirect()->route('contact.success');
    }
}

$request->ip() beachtet die Einstellung der vertrauenswürdigen vorgelagerten Systeme von Laravel.

Prüfung in einem Form Request

Für mehrere Controller legen Sie die Prüfung in einen eigenen FormRequest:

<?php

namespace App\Http\Requests;

use Myrasec\EuCaptcha;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Contracts\Validation\Validator;

class ContactRequest extends FormRequest
{
    public function rules(): array
    {
        return [
            'name'    => ['required', 'string', 'max:255'],
            'email'   => ['required', 'email'],
            'message' => ['required', 'string'],
        ];
    }

    protected function withValidator(Validator $validator): void
    {
        $validator->after(function (Validator $validator) {
            $captcha = new EuCaptcha(
                sitekey: config('services.eucaptcha.sitekey'),
                secret:  config('services.eucaptcha.secret'),
            );

            $result = $captcha->validate(
                $this->input('eu-captcha-response'),
                $this->ip(),
            );

            if (!$result->success()) {
                $validator->errors()->add('captcha', 'CAPTCHA verification failed.');
            }
        });
    }
}

Übergeben Sie der Methode des Controllers anschließend ContactRequest statt Request. Laravel prüft die Anfrage dann vor dem Aufruf der Methode:

public function submit(ContactRequest $request): RedirectResponse
{
    // validation and CAPTCHA check already passed
    // process the form...

    return redirect()->route('contact.success');
}