Captcha - Plaatje

Toelichting

De bots op het internet die onze contactformulieren en gastenboeken volspammen worden met de dag slimmer. Het kraken van captcha's waarbij je een bepaalde code uit een afbeelding moet halen, is voor de meeste bots een fluitje van een cent.

Dit script is gebasseerd op de kinderlijk eenvoudige methode van het herkennen van een afbeelding. In dit geval gaat het om afbeeldingen van dieren waarbij de naam van het dier ingevuld moet worden, maar je zou het natuurlijk met elke willekeurige soort afbeeldingen kunnen doen. Denk bijvoorbeeld aan het herkennen van automerken op een autosite of het herkennen van voetbalclubs aan de hand van de shirts op een voetbalsite.

Op dit moment is het mogelijk om zowel de Nederlandse als Engelse benaming van het dier te gebruiken, maar dit valt natuurlijk makkelijk uit te breiden naar andere talen.

Update (03-11-2008)
Steeds vaker kom ik de misvatting tegen dat een captcha bedoeld is om 'hackers' buiten de deur te houden, maar dat is het niet! Het is enkel bedoeld om te voorkomen dat een geautomatiseerd proces (bot) je formulier invult en automatisch verzendt, i.e. zonder tussenkomst van een menselijk persoon.

Is die tussenkomst er wel, dan zal het vrij eenvoudig zijn om een proces te schrijven dat deze specifieke beveiliging omzeilt. Maar dat is dan ook helemaal niet het doel van een captcha...

Voorbeeld

Klik hier voor een voorbeeld

Script

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
<?php
ini_set
('display_errors''On');
error_reporting(E_ALL);
require 
'../inc/stats.php';
session_start();

if(
$_SERVER['REQUEST_METHOD'] == 'POST')
{
    
$aCaptcha = array (
        array(
'konijn''rabbit'),
        array(
'kat''cat'),
        array(
'varken''pig'),
        array(
'koe''cow'),
        array(
'eend''duck'),
        array(
'kip''chicken'),
        array(
'hond''dog')
    );
    
    if(empty(
$_POST['naam']) || empty($_POST['captcha']))
    {
        
$errors[] = 'Vul alle velden in!';
    }
    elseif(!
in_array(strtolower($_POST['captcha']), $aCaptcha[$_SESSION['key']]))
    {
        
$errors[] = 'Je hebt de captcha niet juist ingevuld. Vul enkel de naam van het dier in.';
    }
    
    if(empty(
$errors))
    {
        
$content[] = '<p>Goed zo '.$_POST['naam'].'! Je hebt de captcha juist weten in te vullen<p>';
    }
}

$_SESSION['key'] = rand(06);
$sImage '/images/captcha/'.$_SESSION['key'].'.png';
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>PHP Scripts - Captcha met plaatje</title>
    
    <link rel="stylesheet" href="../../styles/default.css" type="text/css" media="screen" />
    <link rel="stylesheet" href="../../styles/ubb.css" type="text/css" media="screen" />
</head>
<body>
    <div id="wrap">
        <p class="none small align-right"><a href="/view/43/">&lt;-- Terug naar Scripts</a></p>
        <h1>Captcha met plaatje</h1>
        <div id="info">
            <p>PHP versie: >= 4.1.0</p>
        </div>
        
        <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
        <p>
            <label class="field" for="naam">Naam</label>
            <input type="text" id="naam" name="naam" />
        </p>
        <p>
            <label class="field" for="captcha">Wat is dit voor dier?</label>
            <img src="<?php echo $sImage?>" alt="Captcha" />
            <input type="text" name="captcha" id="captcha" />
        </p>
        <input type="submit" value="Controleren" />
        </form>
        
        <?php
        
// Weergeven van meldingen uit het phpscript.
        
if(isset($errors))
        {
            echo 
'<ul>';
            foreach(
$errors as $error);
            {
                echo 
'<li>'.$error.'</li>';
            }
            echo 
'</ul>';
        }
        elseif(isset(
$content))
        {
            foreach(
$content as $line)
            {
                echo 
$line;
            }
        }
        
?>
    </div>    
</body>
</html>

Reacties