Captcha für Coppermine

Diese Lösung basiert auf diesem Quelltext. Editiere die Datei register.php und füge die Include-Anweisung für plugins/captcha/input.php unmittelbar vor der Zeile mit "if ($errors)" hinzu (irgendwo bei Zeile 178). Etwa bei Zeile 247 füge die Include-Anweisung für plugins/captcha/check.php unmittelbar vor der Anweisung "if ($error != '') return false;" hinzu.

Differenz zum register.php von Coppermine 1.4.20:

178,180d177
<     // Display captcha code and input field
<     include("./plugins/captcha/input.php");
<         
250,253d246
<     // Check captcha code
<     include("./plugins/captcha/check.php");
<         
< 

plugins/captcha/input.php:

<tr>
  <td colspan="2" class="tableb">
    <table>
      <tr>
        <td><img src="plugins/captcha/image.php" width="80" height="40" alt="Captcha Code"></td>
        <td>
          Enter the captcha code (6 letters or digits, case insensitive) 
          shown in the image to prove that you're a human being and not 
          a SPAM robot (reload page if unreadable):
          <input type="text" name="captcha_code" size="6" maxlen="6">
        </td>
      </tr>
    </tabe>
  </td>
</tr>

plugins/captcha/check.php:

<?php

session_start();

if (!$_REQUEST['captcha_code'])
{ $error .= "<li>Captcha code is missing";
}
elseif (md5(strtolower($_REQUEST['captcha_code'])) != $_SESSION['captcha_md5sum'])
{ $error .= "<li>You entered the wrong Captcha code!";
}
?>

plugins/captcha/image.php:

<?php
session_start();
$passlen = 6;
$height = 40;
$width = 80;
$possiblechars = "ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnpqrstuvwxyz23456789";
$captcha_code = "";

for($i = 0; $i<$passlen; $i++)
{ $captcha_code .= substr($possiblechars, rand(0,strlen($possiblechars)-1), 1);
}

$_SESSION['captcha_md5sum'] = md5(strtolower($captcha_code));

$image = imageCreateTrueColor($width, $height);

$ar = rand(80, 255); $er = rand(80,255);
$ag = rand(80, 255); $eg = rand(80,255);
$ab = rand(80, 255); $eb = rand(80,255);
$sr = ($er-$ar)/$height;
$sg = ($eg-$ag)/$height;
$sb = ($eb-$ab)/$height;

for($i=0; $i<$height; $i++)
{ $r = $ar + $i*$sr;
  $g = $ag + $i*$sg;
  $b = $ab + $i*$sb;
  $color = imagecolorallocate($image, $r, $g, $b);
  imageline($image, 0, $height-$i, $width, $height-$i, $color);
}

for($i=1; $i<=100; $i++)
{ $color = imagecolorallocate($image, rand(0,255), rand(0,255), rand(0,255));
  imagesetpixel($image, rand(0,$width-1), rand(0,$height-1), $color);
}

for($i=0; $i<$passlen; $i++)
{ $r = rand(0, 200);
  $g = rand(0, 200);
  $b = rand(0, 200);
  $textcolor = imageColorAllocate($image, $r, $g, $b);
  $shadcolor = imageColorAllocate($image, 255-$r, 255-$g, 255-$b);
  $font = 5;
  $x = 2+ ($width-4)/$passlen*$i+rand(0,6);
  $y = $height/2-rand(0, imagefontheight($font));
  $char = substr($captcha_code,$i,1);
  imagestring($image, $font, $x+1, $y+1, $char, $shadcolor);
  imagestring($image, $font, $x, $y, $char, $textcolor);
}

$bordercolor = imagecolorallocate($image, 80, 80, 80);
imagerectangle($image,0,0,$width-1,$height-1,$bordercolor);

header("Expires: Wed, 1 Jan 1997 00:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header('Content-type: image/png');
imagePNG($image);
imageDestroy($image);
?>