Ruby¶
Das Gem eu_captcha prüft das Token auf dem Server. Es kommt ohne weitere Abhängigkeiten aus und verwendet net/http aus der Standardbibliothek von Ruby.
Voraussetzungen¶
Die folgenden Voraussetzungen müssen erfüllt sein:
| Voraussetzung | Wert |
|---|---|
| Ruby | ab Version 2.7 |
| Zugangsdaten | Öffentlicher Sitekey und Secret aus der Ansicht Details |
Gem installieren¶
Installieren Sie das Gem:
Alternativ ergänzen Sie die Datei Gemfile:
Widget einbinden¶
Ergänzen Sie jede Seite mit einem zu schützenden Formular um den Skript-Verweis:
Fügen Sie das Widget in das Formular ein:
Note
Bei einer Single-Page-Anwendung mit React, Vue oder Angular binden Sie das Widget über das jeweilige npm-Paket ein. Das Gem übernimmt dann allein die serverseitige Prüfung.
Token prüfen¶
Prüfen Sie das übermittelte Token auf dem Server:
require 'eu_captcha'
captcha = EuCaptcha::Client.new(
sitekey: ENV['EUCAPTCHA_SITE_KEY'],
secret: ENV['EUCAPTCHA_SECRET_KEY']
)
result = captcha.validate(
token: params['eu-captcha-response'],
remote_addr: request.ip
)
render_error unless result.success?
Optionen¶
Die folgenden Optionen übergeben Sie als Schlüsselwortargumente an den Konstruktor:
| Option | Typ | Vorgabe | Wirkung |
|---|---|---|---|
sitekey |
String | — | Öffentlicher Sitekey. Der Wert ist erforderlich. |
secret |
String | — | Geheimer Schlüssel. Der Wert ist erforderlich und darf nicht im Browser erscheinen. |
fail_default |
Boolean | true |
Rückgabewert für den Netzwerk- und den Token-Zustand, wenn die API nicht erreichbar ist. true lässt die Absendung zu, false weist sie ab. |
check_cdn_headers |
Boolean | true |
Ermittelt die IP-Adresse des Besuchers aus den Kopfzeilen HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR und HTTP_X_REAL_IP der Rack-Umgebung, bevor REMOTE_ADDR verwendet wird. |
verify_url |
String | Adresse der Produktivumgebung | Überschreibt die Adresse des Endpunkts /verify. Verwenden Sie die Option für Tests. |
credentials_url |
String | Adresse der Produktivumgebung | Überschreibt die Adresse des Endpunkts /verify-credentials. |
Das Ergebnisobjekt¶
validate gibt ein Objekt EuCaptcha::Result mit den folgenden Methoden zurück:
| Methode | Rückgabe |
|---|---|
success? |
true, wenn die API erreichbar war und das Token gültig ist. |
success_network? |
true, wenn der Aufruf der API ohne Netzwerk- oder Übertragungsfehler abgeschlossen wurde. |
success_token? |
true, wenn die API das übermittelte Token als gültig gemeldet hat. |
train |
true, false oder nil. |
Die getrennte Abfrage unterscheidet eine nicht bestandene Challenge von einer Störung der API:
result = captcha.validate(token: params['eu-captcha-response'], remote_addr: request.ip)
unless result.success_network?
# Could not reach the API — consider logging or alerting
end
unless result.success_token?
# Token was rejected — the submission is likely automated
end
Warning
train gibt true zurück, wenn die API die eigentliche Prüfung übersprungen und ein positives Ergebnis erzwungen hat. Das geschieht, wenn der Sitekey nicht besteht, das Secret nicht dazu passt oder der Schutz des Sitekeys abgeschaltet ist. success? wertet dieses Kennzeichen bereits aus und gibt in diesem Fall false zurück. Bei einem Netzwerkfehler gibt train den Wert nil zurück.
Zugangsdaten prüfen¶
Mit verify_credentials prüfen Sie Sitekey und Secret ohne ein Token des Browsers, zum Beispiel beim Start der Anwendung:
captcha = EuCaptcha::Client.new(
sitekey: ENV['EUCAPTCHA_SITE_KEY'],
secret: ENV['EUCAPTCHA_SECRET_KEY']
)
unless captcha.verify_credentials
# Credentials are invalid or the API is unreachable — log and alert
end
Bei einem Netzwerk- oder API-Fehler gibt die Methode false zurück und löst keine Ausnahme aus.
Siehe Endpunkt /verify-credentials.
Ruby on Rails¶
Legen Sie die Zugangsdaten in config/credentials.yml.enc ab und erzeugen Sie den Client in einer Initialisierungsdatei.
Datei config/initializers/eu_captcha.rb:
EU_CAPTCHA = EuCaptcha::Client.new(
sitekey: Rails.application.credentials.dig(:eucaptcha, :sitekey),
secret: Rails.application.credentials.dig(:eucaptcha, :secret)
)
Prüfen Sie das Token im Controller:
class ContactController < ApplicationController
def create
result = EU_CAPTCHA.validate(
token: params['eu-captcha-response'],
remote_addr: request.ip,
user_agent: request.user_agent
)
unless result.success?
render json: { error: 'CAPTCHA verification failed' }, status: :unprocessable_entity
return
end
# process the form...
end
end
request.ip beachtet die Einstellung der vertrauenswürdigen vorgelagerten Systeme von Rails.
Sinatra und Rack¶
Übergeben Sie die Rack-Umgebung, damit das Gem die IP-Adresse und die Kennung des Browsers selbst ermittelt:
require 'sinatra'
require 'eu_captcha'
CAPTCHA = EuCaptcha::Client.new(
sitekey: ENV['EUCAPTCHA_SITE_KEY'],
secret: ENV['EUCAPTCHA_SECRET_KEY']
)
post '/contact' do
result = CAPTCHA.validate(
token: params['eu-captcha-response'],
rack_env: env
)
halt 422, 'CAPTCHA verification failed' unless result.success?
# process the form...
end
Bei einer übergebenen Rack-Umgebung beachtet validate die Einstellung check_cdn_headers.
Vollständiges Beispiel¶
Siehe Svelte und Ruby.