Google stellt alle Daten für das Captcha bereit | Johannes Ulrich Gehrke
Google stellt alle Daten für das Captcha bereit
<?php


// Google reCaptcha Script für den Header
wp_enqueue_script( 'google-recaptcha', 'https://www.google.com/recaptcha/api.js', array(), '2', false ); 

$captcha_secret   = "CAPTCHA_SECRET_KEY" // Bekommt man von Google
$captcha_value    = ( isset( $_POST['g-recaptcha-response'] )  ) ? $_POST['g-recaptcha-response'] : false;
$is_captcha_valid = false;

// Kontrolle ob Captcha Valide ist
if( $captcha_value ) {
	$google_response  = handle_google_captcha( $captcha_secret, $captcha_value );
	$is_captcha_valid = $google_response['success'];
	$error_message    = $google_response['errors'];
}	

// Falls Captacha Valide ist, können die Formdaten 
if( $captcha_value & $is_captcha_valid  ) {
	
	// Hier deine Send-Mail Funktionen rein packen
		
} else {

	// Error Nachricht, falls Captcha nicht validiert wurde

}

?>

<form id="" class="mein_form" action="" method="POST">
	
	<!-- Deine Eingabe Felder -->
	<input type="text" name="mail" value="" placeholder="Ihre Mail Adresse" />
	
	<!-- GOOGLE CAPTCHA -->
	<div class="g-recaptcha" data-sitekey="PUBLIC_KEY_VON_GOOGLE"></div>
	
	<!-- Submit Button -->		
	<input type="submit" class="button__submit" value="Senden">
	
</form>
Eine rudimentäre Form für eine Formular mit Google Captcha
<?php
/* * BEISPIEL ANWENDUNG : ********************************************************* *\
 
  $google_response = handle_google_captcha( 'DEIN_SECRET_KEY', 'CAPTCHA_VALUE' );
  
\* ******************************************************************************** */
 
/**
 * Gibt ein Array zurück ob das Captcha validiert wurde.
 * 
 * Falls das Captcha validiert wurde ist der Array-Key 'success'
 * TRUE, ansonsten FALSE. Falls FALSE, wird eine HTML Error
 * Message mit übergeben auf dem Array-Key 'errors'
 *
 * @param  string $secret   Das Secret des Captchas für die Seite
 * @param  string $response Die Daten des Captcha Felds
 * 
 * @see    validate_google_captcha   
 * 
 * @return array $args{
 *     @type bool   'success' Ist TRUE oder FALSE.
 *     @type string 'errors'  HTML UL-Tag mit LI-Tags für eventuelle Errors.
 * }
 */ 
function handle_google_captcha( $secret = false, $response = false ) {
	if( !$secret | !$response )	 { return false; };
	
	$result = validate_google_captcha( $secret, $response );
	
	$errors = "";
	if( isset( $result->{'error-codes'} ) ) {
		foreach ( $result->{'error-codes'} as $key => $error ) {
			$errors .= "<li>#" . $key . ': ' . $error . '</li>';
		}
	};
	
	$status = array(
		'success' => $result->{'success'},
		'errors'  => '<ul>' . $errors . '</ul>',
	);

	return $status;
};



/**
 * Gibt die Google Antwort als JSON Objekt zurück.
 *
 * @param  string $secret   Das Secret des Captchas für die Seite
 * @param  string $response Die Daten des Captcha Felds
 * 
 * @see    get_google_response    
 * 
 * @return object Antwort von Google als JSON
 */ 
function validate_google_captcha( $secret = false, $response = false ) {
	if( !$secret | !$response )	 { return false; };
	
	$google_response = get_google_response( $secret, $response );

	return 	json_decode( $google_response );
};



/**
 * Gibt die Goolge Antwort auf die Captcha Daten zurück.
 *
 * @param  string $secret   Das Secret des Captchas für die Seite
 * @param  string $response Die Daten des Captcha Felds
 * 
 * @return string Antwort von Google, Text im JSON-Formatiert
 */ 
function get_google_response( $secret = false, $response = false ) {
	if( !$secret | !$response )	 { return false; };
	
	$post_url = 'https://www.google.com/recaptcha/api/siteverify';

	$post_data = array(
	   'secret'   => $secret,
	   'response' => $response,
	);
	
	$post_vars = http_build_query( $post_data );
	
	// Create Connection-Settings
	$ch = curl_init();
	curl_setopt( $ch, CURLOPT_URL, $post_url );
	curl_setopt( $ch, CURLOPT_POST, count( $post_data ) );
	curl_setopt( $ch, CURLOPT_POSTFIELDS, $post_vars );
	curl_setopt( $ch, CURLOPT_RETURNTRANSFER, 1);
	
	// Get Results & Close
	$result = curl_exec( $ch );
	curl_close( $ch );

	return $result;
}
Diese drei Funktionen senden die Daten an Google und werten die Antwort aus

Google Captcha mit PHP als Spam-Schutz für Formulare nutzen

Captchas bieten Hilfe gegen Spam – Als Seitenbetreiber kennt man es, wenn man ein Kontakt-Formular oder ähnliches hat, dass nach einer Weile Spam-Bots auf die Seite gelangen. Diese Bots tragen meist irgendwelche Daten in das Formular ein, probieren Sicherheitslücken zu finden oder wollen einfach Website-Links spamen. Um das zu unterbinden bieten verschiedene Dienstleister Captchas an. Diese kleinen Felder sollen Website-Formulare vor Bots schützen.

Das Google Captcha ist eines der beliebtesten. Dieses ermöglicht es dem Besucher besonders leicht sich als Menschen zu verifizieren. Dies geschieht entweder mit einem einzelnen Klick oder sogar unsichtbar im Hintergrund. Um den Google Captcha Spam-Schutz für Formulare nutzen zu können, wird ein Google-Konto benötigt, danach besucht man folgende Seite:

Dort registriert man eine Webseiten, für die dieses Captcha gelten soll. Danach bekommt man ein Javascript, welches im Header verlinkt werden muss und einen HTML-Block in welchem später das Captcha platziert wird. Wenn man das gemacht hat, dann ist die Frontend Arbeit schon fertig. Interessanter wird die Validierung vom Server. Der Server dem die Formulardaten gesendet werden, muss den Wert des Captcha-Feldes an Google senden. Es gibt dann eine Antwort, ob die Validierung erfolgreich war oder nicht.

Ich habe dafür drei Funktionen geschrieben, die aufeinander aufbauen – man braucht jedoch nur die erste: handle_google_captcha( ‚SECRET_KEY‘, ‚CAPTCHA_VALUE‘ ) . Die Funktion gibt ein Array zurück auf dem im Key ’success‘ als BOOL ein TRUE oder FALSE gespeichert ist. Je nachdem ob die Captcha Validierung erfolgreich war, oder eben nicht. Sollte die Kontrolle Fehlschlagen liegt auf einem zweiten Key ‚errors‘ alle Fehlermeldungen als HTML-String mit einem <ul>-Tag.

In dem ersten Code-Block sieht man eine vereinfachte beispielhafte Anwendung. Zu erst die wichtigsten Variablen klären:

  • $captcha_secret – Hier den Secret-Key aus der Google Admin Seite eintragen
  • $captcha_value – ist der Input-Wert des Captchas
  • $is_captcha_valid – sollte per Default false sein

Im nächsten IF-Block wird ausgelöst, falls es ein Captcha mit übertragen wurde (Ansonsten hat der User das Formular noch gar nicht abgeschickt) und man bekommt alle Rückgaben an das PHP. Danach muss man nur noch überprüfen ob Google grünes Licht gibt oder nicht. Falls alles passt, kann man die restlichen Daten auswerten und das Formular versenden. Sollte es nicht passen wird eine Fehlermeldung ausgegeben.