Captcha

Door PHP Newbie, 21 jaar geleden, 5.329x bekeken

Ik had dit captcha script al een tijdje online staan, en net werd me verteld dat er wel interesse in was. Vandaar dat ik hem even post.

Script is gemakkelijk aan te passen, bovenaan staan enkele variabelen, en er is genoeg commentaar toegevoegd volgens mij.

Lettertypes moet je uploaden naar dezelfde map als waar afbeelding.php staat. En deze moet je toevoegen in de array.

LET OP!

Ik heb géén lettertypes toe gevoegd, die moet je zelf nog even uploaden en in de array zetten.

Commentaar is altijd welkom!

Veel plezier

Voorbeeld: http://phphulp.chessweb.eu/?p=captcha

Gesponsorde koppelingen

PHP script bestanden

  1. captcha

 

Er zijn 46 reacties op 'Captcha'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Hipska BE
Hipska BE
21 jaar geleden
 
0 +1 -0 -1
om zeker nooit problemen te hebben op verschillende servers:
in afbeelding.php
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<? $hoofdletters = FALSE; //hoofdletters of niet TRUE voor ja, FALSE voor nee
// en

if($hoofdletters != FALSE){
// ...
?>
vervangen door
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<? $hoofdletters = false; //hoofdletters of niet true voor ja, false voor nee
// en

if($hoofdletters){
// ...
?>
Luke Banning
Luke Banning
21 jaar geleden
 
0 +1 -0 -1
Je server is enorm traag sinds vandaag.
Maar het script ziet er wel netjes uit, voorbeeld kan ik dus nog niet bekijken ;)
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Klopt hoster zit met DDos attac
Jelmer -
Jelmer -
21 jaar geleden
 
0 +1 -0 -1
Waarvoor is dat laatste bestand (reload.js) nodig? Je gebruikt het verder niet in je code.
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Jelmer,

helemaal gelijk, dit was voor een vorige oplossing die niet werkte ;-)

Ik heb hem verwijderd, bedankt!
Sjoerd
Sjoerd
21 jaar geleden
 
0 +1 -0 -1
Waarom echo je niet gewoon alles in je pagina? PHP sluiten is lelijk! Iedere keer dat je 'm sluit is er één teveel!
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
WTF heb jij het over?

waarom zou ik:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo 'dit';
?>


doet als ik ook gewoon:

dit

kan doen :-s

Verder heb je 2 pagina's nodig omdat je anders geen afbeelding kunt genereren, en dat over php meedere malen sluiten is ook bullshit, dat gaat alleen op voor:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo 'dit';
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo 'en dit';
?>

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
echo 'en ook nog dit';
?>


daar is het 2x te veel ja.
Lissy Pixel
Lissy Pixel
21 jaar geleden
 
0 +1 -0 -1
Dank je wel voor het delen!!!
Heel duidelijk vind ik de toevoeging van de uitleg voor het script.
Voor een ieder is dit script heel goed te volgen!!!
Andy v
Andy v
21 jaar geleden
 
0 +1 -0 -1
lijkt mij gewoon een edit van een versie die hier al ergens staat.
Steff   an
Steff an
21 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
foreach($_POST as $key => $waarde) //foreach de post
    {
        $_SESSION[$key] = $waarde; //en zet de sessie a.d.h.v. de post
    }


Kan je hier niet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$_SESSION = $_POST


Gebruiken?
Jelmer -
Jelmer -
21 jaar geleden
 
0 +1 -0 -1
Als je dat zou doen zouden alle bestaande variabelen in de sessie teniet worden gedaan.
Jens V
Jens V
21 jaar geleden
 
0 +1 -0 -1
mooi scriptje!
Dutchcamel
dutchcamel
21 jaar geleden
 
0 +1 -0 -1
@Steffan en Jelmer:

$_SESSION = array_merge($_SESSION, $_POST);
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
waarom zou ik dat aan gaan passen?

Dit werkt toch perfect, zo weet je zeker dat het goed gaat, niet dan?


21 jaar geleden
 
0 +1 -0 -1
dient dit script eigenlijk voor image verfivation ?

tegen bv spmbots op fora
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Jup
Legolas
Legolas
21 jaar geleden
 
0 +1 -0 -1
als ik string=<md5> en cap=<text> post ben ik toch ook binnen?
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
leg uit legolas?
Legolas
Legolas
21 jaar geleden
 
0 +1 -0 -1
door jou foreachje met $_SESSION en $_POST wordt de $_SESSION['string'] overschreven door die in $_POST. En zo weet de bot dus al van te voren welke code er is.

EDIT: overigens is zo'n foreach je NOOIT goed, veel te veel risico, zeker omdat je het niet altijd kan overzien.
Jelmer -
Jelmer -
21 jaar geleden
 
0 +1 -0 -1
Ghehe, legolas heeft gelijk. Door je foreach-lusje kan je de sessie-variabele die de code bevat naar eigen hand zetten, en zo dus je eigen code gebruiken.
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Jullie hebben gelijk, zou nu opgelost moeten zijn.
Legolas
Legolas
21 jaar geleden
 
0 +1 -0 -1
Nog een leuke: stel je gebruikt dit script op je site. op deze site draait ook een ander script met admin. dan kan ik bijvoorbeeld een admin sessie injecten.

Doe op z'n minst: $_SESSION['_POST'] = $_POST;
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
even een arraytje aangemaakt, hierdoor kun je zelf aangeven welke post waarden niet in een sessie gezet mogen worden.

Edit:

Ik kan ook de foreach eruit halen want op zich heb ik hem niet nodig, maar ja, de kans dat een onwetende gebruiker hem er dan weer inzet is vrij groot, dus ik denk dat ik hem het best zo kan laten
Lissy Pixel
Lissy Pixel
21 jaar geleden
 
0 +1 -0 -1
@ Newbie : leuk de ontwikkeling van dit script. Ik hou een en ander zelf ook bij en zie de groei in deze :)
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Ik vind het ook leuk ;-)

(Al zeg ik het zelf) Een mooi script geschreven, maar blijkt dat er nog wat bugjes in zitten, oplossen, en uiteindelijk komen we op een erg mooi script hoop ik.
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
wat raad jij me aan
Legolas
Legolas
21 jaar geleden
 
0 +1 -0 -1
Kijken naar welke waardes niet mogen is in combinatie met andere scripts nog altijd risicovol, je weet gewoon zeker dat dat fout gaat. Zeker als iemand een open-source pakket gebruikt waarvan hij de variabelen niet kent.
Legolas
Legolas
21 jaar geleden
 
0 +1 -0 -1
Je kan het beste iets unieks voor je eigenscript maken, bijvoorbeeld eigen sub-array in je sessie. Overigens ben ik persoonlijk voor het alvast invullen van het formulier en gewoon altijd het hele formulier te tonen en dus niets te onthouden.
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
ik juist niet Legolas ;-)

Maar ik zal de sessies zo even aan gaan passen dan ;-)
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Aangepast ;-)

Toch gewoon de hele foreach weggehaald.


21 jaar geleden
 
0 +1 -0 -1
blijkt dat dingen dus toch gekraakt kunnen worden: http://sam.zoy.org/pwntcha/
K i p
K i p
21 jaar geleden
 
0 +1 -0 -1
Quote:
Verder heb je 2 pagina's nodig omdat je anders geen afbeelding kunt genereren



Ooh je wel hoor:

<img src="jescriptwaarookplaatjeinzit.php?image=true" />




jescriptwaarookplaatjeinzit.php :
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
<?php

if (!empty($_GET['image']))
{


     if($_GET['image'] == true)
     {


          //image script, inclusief header("image/jpeg"); ofzo

     }

}

else
{

     //rest van je script

}
?>
Michael -
Michael -
21 jaar geleden
 
0 +1 -0 -1
Quote:
blijkt dat dingen dus toch gekraakt kunnen worden: http://sam.zoy.org/pwntcha/

Ik zie op die pagina ook plaatjes van dieren. Is ook een handige manier van anti-spam
<img src="dier.jpg" alt="rara wat is t?"> Wat is dit voor dier?
Lijkt me dat een spam-bot dat niet leest. Moet je t plaatje niet het zelfde noemen als het antwoord natuurlijk.
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
B, op die manier gaat je sessie achterlopen op je antwoord.
Legolas
Legolas
21 jaar geleden
 
0 +1 -0 -1
@PHP Newbie: dat hangt er ook maar vanaf hoe je het opzet...
Dion
Dion
21 jaar geleden
 
0 +1 -0 -1
mijn plaatje doet het niet...
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
linkje?
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
zie hier

Quote:
De afbeelding “http://sparksdump.heefthosting.nl/tutorial/afbeelding.php” kan niet worden weergegeven, omdat hij fouten bevat.


wat heb je veranderd?
Dion
Dion
21 jaar geleden
 
0 +1 -0 -1
niets zogauw ik weet. ik heb effe voor het teste 1 font gebruikt (arial.ttf)
en in dezelfde map als het script gezet.

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
72
73
74
75
76
77
<?php
error_reporting(E_ALL); //error reporting op all
session_start(); //zorgen dat we met sessies kunnen werken
header("Content-type: image/png");

$hoofdletters = FALSE; //hoofdletters of niet TRUE voor ja, FALSE voor nee
$aantal = 6; //aantal karakters
$fonts = array('arial.ttf'); //een array met lettertypes, deze kun je zelf vullen
$vert = 10; //aantal verticale lijnen

if($hoofdletters != FALSE) //als je wel hoofdletters wil
{
    $chars = array_merge(range('a', 'z'), range('A', 'Z'), range(1, 9), range(1, 9)); //maak een array cijfers aan met hoofdletters
}
else //geen hoofdletters?
{
    $chars = array_merge(range('a', 'z'), range(1, 9), range(1, 9)); //dan een array zonder hoofdletters
}

$verify_string = NULL; //verfy string wordt zometeen gevuld, en maken we hier dus aan met waarde NULL

for ($rand = 0; $rand < $aantal; $rand++) //een for loopje welke herhaalt voor het aantal karakters
{
    $random = rand(0, count($chars) -1); //een pak een willekeurige karakter uit de array
    $verify_string .= $chars[$random]; //en voeg deze toe aan de string verfy string
}

$afbsize = $aantal * 18; //de breedte van de afbeelding is het aantal karakters * 18
$strsize = $afbsize - 1; //en de streep lengte is de abeeldings lengte -1

$_SESSION['string'] = md5($verify_string); //de sessie met de code is een md5 van de code

$img = imagecreate($afbsize, 45);

$white = imagecolorallocate($img, 255, 255, 255); //maak even het kleurtje wit aan
$black = imagecolorallocate($img, 0, 0, 0); //en zwart
$grey = imagecolorallocate($img, 81, 81, 81); //en grijs

imagefill($img, 0, 0, $white); //geef de afbeelding een witte achtergrond
imageline($img, 0, 0, 0, 44, $black); //een zwart lijntje links
imageline($img, 0, 0, $strsize, 0, $black); //een zwart lijntje boven
imageline($img, $strsize, 0, $strsize, 45, $black); //een zwart lijntje rechts
imageline($img, 0, 44, $strsize, 44, $black); //en een zwart lijntje onder

for($i = 0; $i < $vert; $i++) //een for loopje voor verticale lijnen
{
    $wil = imagecolorallocate($img, rand(0,255), rand(0,255), rand(0,255)); //creeer een willekeurige kleur
    
    imageline($img, rand(2, $strsize), 1, rand(2, $strsize), 44, $wil); //en een willekeurig lijntje met die willekeurige kleur
}

for ($i = 0; $i < $aantal; $i++) //en ook eentje voor de letters
{
    $wil = imagecolorallocate($img, rand(40,255), rand(40,255), rand(40,255)); //creeer wederom een willekeurige kleur

    $plaats = $i * 16 + 6; //zet de letter even op de goede plaats
    imagettftext($img,
                19,
                rand(-20,20), //willekeurige rotatie
                $plaats, //plaats horizontaal
                rand(20,40), //random plaats verticaal
                $wil, //willekeurige kleur
                $fonts[array_rand($fonts)], //willekeurig lettertype
                $verify_string[$i]); //met de letter
}

$wil = imagecolorallocate($img, rand(0,245), rand(0,245), rand(0,245)); //random kleur

imageline($img, 1, rand(2, 16), $strsize, rand(2, 16), $wil); //lijntje op het bovenste deel van de afbeelding

$wil = imagecolorallocate($img, rand(0,245), rand(0,245), rand(0,245)); //en nog een random kleur

imageline($img, 1, rand(17, 33), $strsize, rand(17, 33), $wil); //en nog een lijntje op het onderste deel

imagepng($img); //creeer afbeelding
imagedestroy($img); //verwijder afbeelding
?>
Seb wd
seb wd
21 jaar geleden
 
0 +1 -0 -1
mooi scriptje, alleen heb ik een probleem. Als je de verkeerde cijfers intoets, dan geeft hij geen foutmelding. Het script wordt dus succesvol uitgevoerd terwijl men de captcha niet goed heeft ingevuld. Als je niets invult geeft hij wel een foutmelding.
Hieronder de code die ik het gebruikt.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php

//meer van dit soort checks, maar niet relevant...

elseif(empty($_POST['cap']) && md5($_POST['cap']) != $_SESSION['string'])
 {

 echo "<SCRIPT LANGUAGE=JavaScript>window.alert('De anti-spam code is niet goed ingevuld!')</SCRIPT>";
       echo "<script language=\"JavaScript\">window.history.back()</script>";
      exit;
      }

?>


Wat is er precies fout?

Seb.
Seb wd
seb wd
21 jaar geleden
 
0 +1 -0 -1
Ik heb trouwens de bovenstaande sript letterlijk geknipt en geplakt en daar geeft hij de foutmelding die in het script staat helemaal niet. Het script klopt dus volgens mij niet of zie ik wat over het hoofd?

Seb.
PHP Newbie
PHP Newbie
21 jaar geleden
 
0 +1 -0 -1
Nou, het zal wel meevallen met dat letterlijk gekopieerd en geplakt.

Ik zie in mijn script op regel 39 namelijk staan !empty en bij jou empty()

je bent dus een ! vergeten
Kay Kay
Kay Kay
20 jaar geleden
 
0 +1 -0 -1
Deze captcha is niet SPAM VEILIG!!
Je zet je cookies uit en je kan gewoon posten zonder de captcha in te vullen..

Ook heb ik met deze captcha al veel spam gehad...
Wouter K
Wouter K
20 jaar geleden
 
0 +1 -0 -1
Een vraagje moet je zelf de plaatjes min of meer maken ?
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
PHP Newbie
PHP Newbie
20 jaar geleden
 
0 +1 -0 -1
Heb het even uitgeprobeerd Kay en je argument klopt niet. Als je cookies uitstaan kun je niet posten..

@Wouter,
Nee, de plaatjes worden d.m.v. de GD Library gemaakt.

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

Inhoudsopgave

  1. 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.