Captcha web service

Wir stehen immer wieder vor der Herausforderung die verschiedensten Web-Dienste und Formulare gegeb Bots zu schützen. Insbesondere Kontaktformulare sind ein beliebtes Ziel. Captchas sind ein erprobtes Werkzeug gegen diese (SPAM-) Bots. Damit wir das Rad nicht auf jeder Webseite neu erfinden müssen haben wir diesen kleinen Dienst entwickelt.

Die Captchas werden mit der unter der GPL3 lizensierten Captcha-Klasse von Jose Rodriguez erstellt.

Eine Beispiel Implementierung für ein PHP gestütztes Formular mit jQuery-Unterstützung auf der Client-Seite:


HTML Quelltext für die Website:

<!-- Image location -->
<span id="captchaImage"></span>

<!-- Get image from server -->
<script>
function getCaptcha() {
  $.ajax({
    method: 'POST',
    url: '//captcha.netzmal.de/getSession.php',
    dataType: 'json'
  }).done(function(data) {
    $('#captchaImage').html('<img src="//captcha.netzmal.de/captcha.php?session=' + data.session.id + '">');
    $('#captchaSession').val(data.session.id);
  });
}
getCaptcha();
</script>

<!-- User form -->
Please enter Captcha here:<br>
<form action="yourFormHandler.php" method="get" target="_blank">
<input type="hidden" id="captchaSession" name="captchaSession" value="">
<input type="text" name="captcha" value=""><br>
<input type="submit" value="Check Captcha"><br>
...
</form>
Test:

Please enter Captcha here:




Output:
Enter Captcha and click on "Check Captcha" to get result

PHP Quelltext:

<?php

// Init result
$captcha_ok = false;

try {
  // Read user input
  $captcha = "";
  if (isset($_POST['captcha'])) {
    $captcha = $_POST['captcha'];
  } else if (isset($_GET['captcha'])) {
    $captcha = $_GET['captcha'];
  }
  $session = "";
  if (isset($_POST['captchaSession'])) {
    $session = $_POST['captchaSession'];
  } else if (isset($_GET['captchaSession'])) {
    $session = $_GET['captchaSession'];
  }
  $data = http_build_query(array('captcha' => $captcha, 'session' => $session));

  // HTTPS request
  $curl = curl_init();
  curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
  curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($curl, CURLOPT_URL, 'https://captcha.netzmal.de/check.php?' . $data);
  curl_setopt($curl, CURLOPT_POST, false);
  $res = json_decode(curl_exec($curl), true);
  if ($res['captcha']['ok'] == 1) {
    $captcha_ok = true;
  }
  curl_close($curl);
} catch (Exception $e) {
}

// What to do...
if ($captcha_ok) {
  print "Entered captcha is _OKAY_";
} else {
  print "Entered captcha is _WRONG_";
}