Captcha - Afbeelding (verouderd)

Toelichting

Je ziet ze steeds vaker en ze worden tegenwoordig voor allerlei doeleinden gebruikt: captcha's. Om spam te voorkomen in gastenboeken of om bijvoorbeeld te verifiëren dat het een menselijke gebruiker is die zich in wil schrijven, overal zien we die plaatjes met een code die je over moet tikken.

Opmerking: Visuele captcha's zoals in dit voorbeeld zijn tegenwoordig steeds makkelijker te kraken door bots en deze captcha is dan ook al vrij achterhaald. Kijk ook eens op deze website voor meer informatie. Twee andere voorbeelden van captcha's die niet met afbeeldingen werken zien de volgende:

Captcha met berekening
Captcha met eenvoudige vraag
Captcha met plaatje

Deze laatste werkt weliswaar met een afbeelding, maar volgens een volledig ander principe. Er valt immers niets uit te lezen door een bot.

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
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
<?php
ini_set
('display_errors'1);
error_reporting(E_ALL);
session_start();

function 
generate_string($length)
{
    
// De tekens die in de string gebruikt mogen worden.
    
$tekens array_merge(range('A''Z'), range(19));
    
    
// Het genereren van de string
    
$string '';
    for(
$i 0$i $length$i++)
    {
        
shuffle($tekens);
        
$string .= $tekens[0];
    }
    
// Sla de string op in een sessie om hem later te kunnen gebruiken.
    
$_SESSION['captcha'] = $string;
    return 
true;
}
function 
captcha($string)
{
    
// Breedte en hoogte van de afbeelding bepalen.
    
$factor 25;
    
$breedte $factor strlen($string);
    
$hoogte 30;
    
$image imagecreatetruecolor($breedte$hoogte);
    
    
// Lettertypen (locatie en type)
    
$dir 'fonts/';
    
$fonts = array('comic.ttf''verdana.ttf');
    
shuffle($fonts);
    
    
// Eerst wat kleuren instellen die we gebruiken
    
$background_color imagecolorallocate($image169204253);
    
$line_color imagecolorallocate($image255249191);
    
$text_color imagecolorallocate($image11197136);
    
    
// Achtergrondkleur instellen
    
imagefill($image00$background_color);
    
    
// Tekens in de afbeelding plaatsen
    
$size 11;
    
$x_left 5// Linker marge van eerste teken.
    
    // Gebruik een for-loop om alle characters van de string één voor één te tekenen.
    
for($i 0$i strlen($string); $i++)
    {
        
$angle rand(-1515);
        
$x rand($x_left 3$x_left 3);
        
$y round(rand(3/6*$hoogte5/6*$hoogte));
        
$font $dir.$fonts[0];
        
$char $string{$i};    
        
        
// Teken het character.
        
imagettftext($image$size$angle$x$y$text_color$font$char);
        
        
// Nieuwe marge voor volgend teken.
        
$x_left += $factor;
    }
    
    
// Verschillende lijnen door de achtergrond laten lopen:
    
$aantal 5;
    
$spread 10;
    
$x_begin 0;
    
$x_eind $breedte;
    
    for(
$i 0$i $aantal$i++)
    {
        
// Begin en eind waarde op de y-as random bepalen.
        
$y_begin rand(-$spread$hoogte $spread);
        
$y_eind rand(-$spread$hoogte $spread);
        
        
// Teken de lijnen.
        
imageline($image$x_begin$y_begin$x_eind$y_eind$line_color);
    }
        
    
header('Content-type: image/jpeg');
    
imagejpeg($image);
}


// Voor het genereren van de afbeelding.
if(isset($_GET['captcha']))
{
    
// Creëer de CAPTCHA aan de hand van de string in de sessie variabele.
    
captcha($_SESSION['captcha']);
    
    
// De rest van dit script hoeft niet uitgevoerd te worden.
    
exit();
}

// Afhandeling van het formulier.
if($_SERVER['REQUEST_METHOD'] == 'POST')
{
    
// strtoupper() om te zorgen dat ook lowercase input correct is.
    
$code strtoupper($_POST['captcha']);
    if(
$code == $_SESSION['captcha'])
    {
        
$content[] = '<p><b>Het formulier is succesvol verzonden</b></p>';
        
$content[] = '<ul>';
        
$content[] = '<li>Naam: '.$_POST['naam'].'</li>';
        
$content[] = '<li>Woonplaats: '.$_POST['woonplaats'].'</li>';
        
$content[] = '</ul>';
    }
    else
    {
        
$errors[] = '<p><b>De ingevulde code komt niet overeen!</b></p>';
        
header('Refres: 3; url='.$_SERVER['PHP_SELF']);
    }
}
?>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>

<head>

    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>Jorendewit.nl - PHP Scripts - Bestanden uploaden</title>
    
    <link rel="stylesheet" href="../styles/default.css" type="text/css" media="screen" />
    
</head>

<body>

    <div id="wrap">
        <p class="none small align-right"><a href="/view/14/">&lt;-- Terug naar Scripts</a></p>
        <h1>Captcha beveiliging</h1>
        
        <div id="info">
            <p>PHP versie: &gt;= 4.1.0</p>
            <p>GD versie: &gt;= 2.0.1</p>
        </div>
        
        <form action="#" method="post" name="captcha">
        <p>
            <label class="field" for="naam">Naam:</label>
            <input type="text" name="naam" id="naam" />
        </p>
        <p>
            <label class="field" for="woonplaats">Woonplaats:</label>
            <input type="text" name="woonplaats" id="woonplaats" />    
        </p>    
        <?php
            
if($_SERVER['REQUEST_METHOD'] != 'POST')
            {
                
// Alleen een nieuwe string maken als het formulier niet gepost is.
                
generate_string(6);
            }
            
// Weergeven van de afbeelding.
            
echo '<img src="?captcha" alt="captcha" class="img_lijnuit" />';
            
        
?>
        <p>
            <label class="field" for="captcha">Code:</label>
            <input type="text" name="captcha" />
        </p>
        <p>
            <input type="submit" value="Verzenden" class="lijnuit" />
        </p>
        </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