So lösen Sie reCAPTCHA v3 in PHP und legen eine Action fest

reCAPTCHA v3 rendert niemals eine Challenge. Es bewertet den Besuch unauffällig und gibt der Seite ein Token, das das Backend der Website anschließend verifiziert. Für Ihren Code bedeutet das: Es gibt nichts anzuklicken, die gesamte Aufgabe besteht also darin, ein Token zu erzeugen, das die Website akzeptiert. In PHP ist das derselbe recaptcha Methode, die Sie für v2 verwenden würden, mit einem Versions-Flag im options-Array.
Was darüber entscheidet, ob es funktioniert, ist die Action.
Einrichtung
# PHP 8.0+, with the curl and json extensions. composer require capskip/capskip
use CapSkip\CapSkip;
$solver = new CapSkip([
'host' => '127.0.0.1',
'port' => 8080,
'recaptchaTimeout' => 300, // seconds, shared with Turnstile and GeeTest
]);CapSkip läuft auf Ihrem eigenen Rechner, daher muss die Desktop-App zuerst geöffnet sein.
Der grundlegende Aufruf
$result = $solver->recaptcha(
'6Lc...YOUR_SITEKEY',
'https://example.com/checkout',
[
'version' => 'v3',
'action' => 'submit',
]
);
echo $result['code']; // the v3 tokenZwei Dinge unterscheiden sich von v2. version muss sein v3, und action sollte mit dem übereinstimmen, was die Seite übergibt an grecaptcha.execute. Lassen Sie es weg, ist der Standardwert verify.
Warum die Action wichtig ist
Actions sind Labels, die eine Website an jede geschützte Interaktion anhängt, damit ein Login und ein Checkout getrennt bewertet werden können. Die meisten Backends prüfen, ob die vom Token getragene Action mit der übereinstimmt, die sie für diesen Endpunkt erwartet haben.
Senden Sie das falsche Label, ist der Token zwar echt, aber für eine andere Interaktion gekennzeichnet, was viele Verifizierer rundweg ablehnen. Lesen Sie den echten Wert von der Seite aus, statt zu raten:
$html = file_get_contents('https://example.com/checkout');
// Sites normally call execute() with the action as a string literal.
preg_match('/execute\([^,]+,\s*\{\s*action:\s*[\'"]([^\'"]+)/', $html, $m);
$action = $m[1] ?? 'verify';
$result = $solver->recaptcha($sitekey, $pageUrl, [
'version' => 'v3',
'action' => $action,
]);Häufige Werte sind login, submit, homepage und checkout, aber sie sind willkürliche Zeichenketten, die von dem gewählt wurden, der die Website erstellt hat.
Enterprise v3
$result = $solver->recaptcha($sitekey, $pageUrl, [
'version' => 'v3',
'enterprise' => 1,
'action' => 'submit',
]);Enterprise ist eher ein orthogonales Flag als ein separates Produkt, daher wird es auf den v3-Aufruf aufgesetzt. Unterscheiden Sie sie anhand des Skripts, das die Seite lädt: Enterprise lädt enterprise.js, Standard-Pulls api.js. Ein falsches Raten lässt die Lösung scheitern, statt einen fehlerhaften Token zurückzugeben, das Testen kostet also nichts.
Den Token übermitteln
$ch = curl_init('https://example.com/checkout');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_POSTFIELDS => json_encode([
'token' => $result['code'],
'order_id' => '...',
]),
]);
$response = curl_exec($ch);
curl_close($ch);Anders als bei v2 gibt es kein Standard-Formular-Widget, das die Form vorgibt, daher variieren v3-Integrationen. Manche verwenden ein verstecktes g-recaptcha-response -Eingabefeld, andere senden JSON mit einem benutzerdefinierten Schlüssel per POST. Prüfen Sie das JavaScript der Seite selbst, bevor Sie einen Feldnamen annehmen.
Fehler
use CapSkip\Exceptions\ApiException;
use CapSkip\Exceptions\NetworkException;
use CapSkip\Exceptions\TimeoutException;
try {
$result = $solver->recaptcha($sitekey, $pageUrl, ['version' => 'v3']);
} catch (NetworkException $e) {
// CapSkip is not running on the configured port
} catch (ApiException $e) {
// the sitekey or pageurl was rejected
} catch (TimeoutException $e) {
// exceeded recaptchaTimeout
}Beachten Sie den CapSkip\Exceptions Namespace. Das Kopieren von Imports aus den Python- oder Node-Beispielen ist hier eine häufige Ursache für fatale Fehler.
Häufig gestellte Fragen
Kann ich den Score vor dem Übermitteln prüfen?
Nein. Der Score liegt bei Google und wird dem Website-Betreiber erst offengelegt, wenn dessen Backend das Token verifiziert. Auf der Client-Seite erhalten Sie ein Token und sonst nichts, es gibt also im Vorfeld nichts zu prüfen oder zu filtern.
Sollte ich innerhalb eines Web-Requests lösen?
Vorzugsweise nicht. PHP ist synchron und eine Lösung kann mehrere Sekunden dauern, sodass die Ausführung während eines Seiten-Renderings einen Worker für die gesamte Dauer blockiert. Verlagern Sie sie in einen Job in der Warteschlange oder einen CLI-Worker.
Was, wenn die Seite niemals eine action setzt?
Einige Seiten rufen auf execute ohne einen, in welchem Fall der Standard verify korrekt ist. Wenn Ihr Regex nichts findet, ist das meist der Grund und kein Parsing-Fehler.
Zusammenfassung
Legen Sie fest version zu v3, passen Sie es an action an das, was die Seite ausführt, fügen Sie enterprise wenn es lädt enterprise.js, importieren Sie Exceptions von CapSkip\Exceptions, und senden Sie den Token schnell ab, da er in etwa zwei Minuten abläuft.
Andere Sprachen werden behandelt auf der reCAPTCHA-v3-Löser Seite, Enterprise-Details auf der Enterprise-Löser Seite, und die umfassendere PHP-Oberfläche auf der PHP-Captcha-Löser Seite. Sehen Sie, wie ein Token live erzeugt wird, auf unserer v3-Demo. CapSkip ist ein Captcha-Löser das auf Ihrer eigenen Hardware läuft.
