Simpele zwart / wit captcha

Door Erik Rijk, 21 jaar geleden, 6.291x bekeken

Dit script genereerd een plaatje met een random "numerieke" code die correct dient worden overgenomen om bijv: Een formulier te submitten.

Het is een vrij simpele captcha.
Het maakt gebruik van witte cijfers en witte lijnen met een zwarte achtergrond.

Ik heb er veel commentaar in verwerkt zodat ook de beginnende PHP-er dit script goed kan begrijpen.

Gaarne reacties van wat beter kan, zodat ik er ook weer van kan leren :)

Mvg,

Erik

Gesponsorde koppelingen

PHP script bestanden

  1. simpele-zwart-wit-captcha

 

Er zijn 36 reacties op 'Simpele zwart wit captcha'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
T H
T H
21 jaar geleden
 
0 +1 -0 -1
Ziet er netjes uit, ga ik zeker testen/gebruiken :-)

gr, tim
Luke Banning
Luke Banning
21 jaar geleden
 
0 +1 -0 -1
Voorbeeldje?
Zal ik de kleurenblinden-test wel doen :)
Erik Rijk
Erik Rijk
21 jaar geleden
 
0 +1 -0 -1
Ik kan zelf geen voorbeeld online plaatsen :(
Luke Banning
Luke Banning
21 jaar geleden
 
0 +1 -0 -1
http://luckyluke-services.nl/phphulp/captcha/index.php
Voorbeeldje, maar, werkt hier niet :|
Willem-Aart
Willem-Aart
21 jaar geleden
 
0 +1 -0 -1
Zo te zien is het lettertype dat 'ie gebruikt niet aanwezig op de server.
Luke Banning
Luke Banning
21 jaar geleden
 
0 +1 -0 -1
Inderdaad, had hem nog niet in IE geopend... in FF geeft ie andere fout
Marnix
Marnix
21 jaar geleden
 
0 +1 -0 -1
Bij mij doet hij het ook niet.
http://www.marnixsmit.nl/captcha.php
Niek Ha
Niek Ha
21 jaar geleden
 
0 +1 -0 -1
@ MArkicks .. hij deed het bij de 1e x toen ik hem opende.. bij refresh doet hij het niet meer
Erik Rijk
Erik Rijk
21 jaar geleden
 
0 +1 -0 -1
hmz,

bij de array fonts, moeten jullie even fonts neerzetten die door jullie server ondersteund worden...

dan zal hij wel werken :)
Robert Deiman
Robert Deiman
21 jaar geleden
 
0 +1 -0 -1
Hoe kan je die fonts vinden, hoe kan je zien welke fonts op de server worden ondersteund?
Erik Rijk
Erik Rijk
21 jaar geleden
 
0 +1 -0 -1
dat is een goeie vraag.
Ik neem aan dat op een normale windows server deze fonts die ik gebruik al wel aanwezig zijn, aangezien het toch wel de meest gebruikte fonts zijn.

Als het een linux server is zou je misschien via google kunnen zoeken wat de meest gebruikte fonts daarvoor zijn.
Legolas
Legolas
21 jaar geleden
 
0 +1 -0 -1
gwoon in dezelfde map als t script fonts uploaden ;)
Wouter
Wouter
21 jaar geleden
 
0 +1 -0 -1
@markicks: na 3keer te refreshen kwam ik de juiste pagina uit
@luke : na 100de keren refreshen kwam ik steeds iets anders uit
Erik Rijk
Erik Rijk
21 jaar geleden
 
0 +1 -0 -1
@ Legolas

Dat kan natuurlijk ook :P


21 jaar geleden
 
0 +1 -0 -1
kan hier iemand een voorbeeld online zetten (want erik kan het niet zei hij :p)
J orii
J orii
21 jaar geleden
 
0 +1 -0 -1
@Luke Banning
Na < ? moet je altijd php zetten dan doet ie het waarschijnlijk wel

Dus dan wordt het:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
.....
.....
....

?>
Robert Deiman
Robert Deiman
21 jaar geleden
 
0 +1 -0 -1
@jori

Neej, dat is het probleem niet. Zoals al eerder aangegeven door Willem-Aart ligt dat eraan dat het lettertype niet beschikbaar is.

@Luke
Toevallig ook lycos?
Leroy Boerefijn
Leroy Boerefijn
21 jaar geleden
 
0 +1 -0 -1
als je een aantal fond's in dezelfde map zet.. dan de naam ervan in de array (plus ext) doet hij het denk ik gewoon
Robert Deiman
Robert Deiman
21 jaar geleden
 
0 +1 -0 -1
Legolas:
gwoon in dezelfde map als t script fonts uploaden ;)


Heb ik geprobeerd, ook heb ik de locatie naar het lettertype (.ttf) aangepast, zodat het nu de exaxte locatie is. --> werkt niet, ook niet zonder.
Rudie dirkx
rudie dirkx
21 jaar geleden
 
0 +1 -0 -1
Paar opmerkingen.

Je moet niet boven in al content-type veranderen naar image/ want dan zie je errors niet meer (dan wordt een plaatje geprint met foute content).

Je moet niet elke instance van je for loop een kelfde kleur aanmaken (dmv imagecolorallocate() ). Je maakt precies dezelfde kleur, in precies dezelfde variabele, maar dan 10 keer :)
Als je voor de loops 1 keer die klaar maakt ben je klaar... Gaat wat sneller.

De methode om 4 cijfers achter elkaar te krijgen is ook een stuk makkelijker mogelijk ;) :

rand(1000,9999);

Als je geen nullen erin wilt kan je die replacen met rand(1,9):

str_replace('0', (string)rand(1,9), (string)rand(1000,9999));

Maar het script is echt cool en ik ga het gebruiken :) Misschien ff kleurtje erin gooien, want soms is erg onduidelijk.
Verschillende rotaties en fonts is geweldig :)
Stuk beter dan wat ik nu gebruik (zie http://games.jouwmoeder.nl/pornstars/?changepage=login)! :)
Cheers!
Erik Rijk
Erik Rijk
21 jaar geleden
 
0 +1 -0 -1
thnx tommyv,

Ik ga hem eens aanpassen
Rudie dirkx
rudie dirkx
21 jaar geleden
 
0 +1 -0 -1
Ik heb je form iets veranderd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
<form method="post" action="">
    <p>
        <img src="captcha.php" alt="captcha error" onclick="this.src='captcha.php?t='+(new Date()).getTime();" />
    </p>
    <p>
        Neem de code precies zo over zoals aangegeven hierboven.<br />
        <label for="captcha_code">Code:</label>
        <input type="text" name="captcha_code">
    </p>
    <p>
        <input type="submit" name="submit" value="Controleer">
    </p>
</form>


En je script:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?php

session_start();

// We defineren een aantal variabelen
$lijnen = 6;
$fonts = array(
    'times.ttf',
    'tahoma.ttf',
    'verdana.ttf',
);


// Create code
$captcha_code = str_replace('0', (string)rand(1,9), (string)rand(1000,99999));

// Save number of chars
$aantal_karakters = strlen($captcha_code);


// we zetten een sessie met de code en encrypten die met sha1();
$_SESSION['captcha_code'] = sha1($captcha_code);

// we geven de breedte van de afbeelding op
$breedte = $aantal_karakters * 20;
// we geven de lengte van de lijnen op
$lijn_lengte = $breedte;

// we maken het plaatje aan
$image = imagecreatetruecolor($breedte, 45);

// alle lijnen maken we wit
$kleur = imagecolorallocate($image, 255, 255, 255);

// we maken een for loop for de random lijnen
for($i = 0; $i < $lijnen; $i++)
{

    imageline($image, mt_rand(2, $lijn_lengte), 1, mt_rand(2, $lijn_lengte), 44, $kleur);
}


// we geven alle we maken alle letters wit
$kleur = imagecolorallocate($image, 255, 255, 255);
$arrTextColors = array(
    imagecolorallocate($image, 0, 255, 255),    // licht blauw
    imagecolorallocate($image, 255, 0, 255),    // licht paars
    imagecolorallocate($image, 255, 255, 0),    // geel
//    imagecolorallocate($image, 0, 0, 255),        // donker blauw

    imagecolorallocate($image, 255, 0, 0),        // rood
    imagecolorallocate($image, 0, 255, 0),        // licht groen
);

// we maken een for loop voor de letters
for ( $i=0; $i<$aantal_karakters; $i++ )
{

    // Write
    imagettftext(
        $image,
        19,
        mt_rand(-20,20),                                    // willekeurige rotatie
        6+$i*16,                                            // plaats horizontaal
        mt_rand(20,40),                                        // random plaats verticaal
        $arrTextColors[rand(0,count($arrTextColors)-1)],    // willekeurige kleur
        $fonts[array_rand($fonts)],                            // willekeurig lettertype
        $captcha_code[$i]                                    // de letter
    );
}


header('Content-type: image/png');
imagepng($image);
imagedestroy($image);

?>


Ik vind m cool :) bedankt

Robert
Robert
21 jaar geleden
 
0 +1 -0 -1
EDIT:Als ik captcha.php hopen krijg ik ook de foutmelding dat de font niet geopend kunnen worden. Hoe los ik dat op? Welke fonts kan ik misschien wel gebruiken?
Rudie dirkx
rudie dirkx
21 jaar geleden
 
0 +1 -0 -1
Quote:
De map is gechmod naar 777 zodat een plaatje geschreven kan worden

Er hoeft geen plaatje geschreven te worden :) Dus chmod heeft geen zin! Doe maar niet zelfs.
Je moet ff die image/png header onderaan zetten (net boven imagepng()):


header('Content-type: image/png');
imagepng($image);
imagedestroy($image);


Dan zie je errors. Je moet ff een alt="" attribute maken in je <IMG> tag, zodat je ziet als er een error is.
En dan naar captcha.php gaan om de error te lezen :)


Edit:
Fonts uploaden vanaf je C:\WINDOWS\Fonts\ map en in een mapje gooien waar je php script er bij kan. Misschien staan ze ook wel in de linux root ofzo, maar zelf bij de hand hebben is wel slim. Ze staan iig (lowercase) op http://games.jouwmoeder.nl/pornstars/css/...
Katjan
katjan
21 jaar geleden
 
0 +1 -0 -1
hmm.. hoe lastig zou het zijn dit uit te lezen?
de strepen etc staan ACHTER de tekst.. dus die kan je zo weggooien..
ik denk dat een ecr niet te moeilijk te maken is voor deze captcha's..

groet,
huib
Michael -
Michael -
21 jaar geleden
 
0 +1 -0 -1
Probeer t eens uit huib, ben benieuwd!
Rudie dirkx
rudie dirkx
21 jaar geleden
 
0 +1 -0 -1
Ik ben ook erg benieuwd... Knock yourself out Huib! Do your thing!
Simon
simon
21 jaar geleden
 
0 +1 -0 -1
Het plaatje en de test werken goed bij mij, maar ik heb een probleem met het invoegen in het formulier. Mijn kennis van PHP komt nog wat tekort, misschien wil iemand een voorbeeld maken hoe het te verwerken in een mail formulier.
Rudie dirkx
rudie dirkx
21 jaar geleden
 
0 +1 -0 -1
Heb een nieuwe gemaakt. Met achtergrond chars ipv lijntjes:
http://games.jouwmoeder.nl/pornstars/c/captcha.gif
Zie ook http://games.jouwmoeder.nl/pornstars/c/captcha.gif
Jordy
Jordy
21 jaar geleden
 
0 +1 -0 -1
@ tommyv:

Prachtig!! Kan je misschien de code posten of PMen?
Thanks :)
Geert
Geert
21 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
<?
// controlen of het formulier gesubmit is
if($_SERVER['REQUEST_METHOD'] == 'POST')
{

    if(!empty($_POST['captcha_code']) && sha1($_POST['captcha_code']) == $_SESSION['captcha_code'])
    {

        echo 'De code is correct, Gefeliciteerd!';
    }

    else {
        echo 'De ingevoerde code is niet juist, Flauwerd!';
    }
}

else {
    echo '
        <form method="post" action="'
.$_SERVER['PHP_SELF'].'">
        <p>
            <img src="captcha.php" />
        </p>
        <p>
            Neem de code precies zo over zoals aangegeven hierboven.<br />
            <label for="captcha_code">Code:</label>
            <input type="text" name="captcha_code">
        </p>
        <p>
            <input type="submit" name="submit" value="Controleer">
        </p>
        </form>
    '
;
}

?>


Ik ben een beginnende php-er en:
Ik snap dit niet:

Waarom staat er eerst De code is correct, Gefeliciteerd! en pas daarna het formulier? Ik snap de logica niet helemaal.

Wie kan me dit uitleggen?

Geert van der Heide
Winsley
winsley
20 jaar geleden
 
0 +1 -0 -1
Fatal error: Call to undefined function imagettftext() in /www/freehyperspace.com/s/c/a/scarface/htdocs/onzin/captcha.php on line 55

Hoe los ik dit op?
TJVB tvb
TJVB tvb
20 jaar geleden
 
0 +1 -0 -1
Heb je wel alles geinstalleerd?

php.net:
Note: This function requires both the GD library and the » FreeType library.
Winsley
winsley
20 jaar geleden
 
0 +1 -0 -1
GD Installed Yes
FreeType Support No
Martijn Peek
Martijn Peek
19 jaar geleden
 
0 +1 -0 -1
is de achtergrond kleur van het plaatje ook aan te passen ?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Nigel
Nigel
18 jaar geleden
 
0 +1 -0 -1
vraagje kun je in captcha bijvoorbeeld een watermerk logo zetten van bijvoorbeeld je bedrijf, of is dat niet mogelijk

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. simpele-zwart-wit-captcha

Labels

  • Geen tags toegevoegd.

Navigatie

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.