login  Naam:   Wachtwoord: 
Registreer je!
 Tutorials

Tutorials > PHP


Gegevens:
Geschreven door:
Nrzonline
Moeilijkheidsgraad:
Normaal
Hits:
50304
Punten:
Aantal punten:
 (4.31)
Aantal stemmen:
13
Stem:
Niet ingelogd
Nota's:
 Lees de nota's (21)
 

Tutorial:

'Captcha' Beveiliging Maken

1. Inleiding Tutorial
2. Mogelijkheden Tutorial Captcha
3. De Captcha Image Maken
4. Nader Uitleg Functies
5. Toepassings Voorbeeld
6. Nawoord

1. Inleiding Tutorial

Een captcha (een afkorting van "completely automated public Turingtest to tell computers and humans apart") is een reactietest die in de gegevensverwerking wordt gebruikt om te bepalen of er al dan niet sprake is van een menselijke gebruiker. Het wordt gebruikt om geautomatiseerde handelingen te beveiligen tegen bots die diverse online diensten gebruiken. In deze totorial leg ik uit hoe je een visuele captcha kunt maken. Hierbij gebruiken wij het GD Library, waarvan al tutorials online zijn. Ik raad je aan om de GD Library tutorials van Tibbah eerst leest en onder de knie hebt. GD Library Deel 1, GD Library Deel 2.
Helaas kan je tegenwoordig ook met captchas er nooit zeker meer van zijn of hij wel goed werkt tegen bots, vanwege projecten die captchas alsnog kunnen uitlezen zoals Pwntcha. Vandaar dat men ze zo moeilijk mogelijk maakt, maar helaas zijn deze ook niet altijd evengoed te lezen door de menselijke bezoekers.

top


2. Mogelijkheden Tutorial Captcha

In deze tutorial gaan we een captcha maken die meerdere fonts gebruikt, die per karakter zijn eigen font, x-as locatie, y-as locatie, kleur en draaihoek heeft. In deze tutorial maken we een image gebaseerd op een code van 4 óf 5 karakters lang. Aan het eind van deze tutorial leg ik ook nog even uit hoe je deze captcha zou kunnen gaan toepassen, om er voor te zorgen dat de captcha natuurlijk ook werkt. Mocht je nog geen goeie fonts hebben, kijk dan even op DaFont. Gebruik alleen TrueType Fonts! (extentie: .ttf/.TTF)

top


3. De Captcha Image Maken

<?PHP
error_reporting 
(E_ALL); // fouten weergeven

$code 'D5KP9'// even een testcode aanmaken, zie paragraaf 5 voor een voorbeeld keygen.
$image imagecreatetruecolor (30060); // maakt de image met de groote van 300px breed, en 60px hoog
$aFonts = array ('font1.ttf''font2.ttf''font3.ttf''font4.ttf'); // zet alle beschikbare fonts in een array
$aCode str_split ($code); // zet alle karakters apart in een array

for ($i 0$i count ($aCode); $i++) // een for-lus maken voor het aantal karakters dat de $aCode array bevat
{
   
$fontcolor imagecolorallocate ($image// kleurencombinatie maken voor de image variabel ($image)
      
rand (190255), // rood,
      
rand (190255), // groen,
      
rand (190255)); // blauw, deze geven de nieuwe kleur per karakter
   
if (count ($aCode) == 4// de volgende locaties (x-as) aanmaken voor een code van 4 karakters lang
   
{
      
$pos[0] = rand (1555); // locatie aanmaken (x-as) voor de eerste karakter
      
$pos[1] = rand (80120); // locatie aanmaken (x-as) voor de tweede karakter
      
$pos[2] = rand (145185); // locatie aanmaken (x-as) voor de derde karakter
      
$pos[3] = rand (210250); // locatie aanmaken (x-as) voor de vierde karakter
   
}
   if (
count ($aCode) == 5// de volgende locaties (x-as) aanmaken voor een code van 5 karakters lang
   
{
      
$pos[0] = rand (1045); // locatie aanmaken (x-as) voor de eerste karakter
      
$pos[1] = rand (65100); // locatie aanmaken (x-as) voor de tweede karakter
      
$pos[2] = rand (120155); // locatie aanmaken (x-as) voor de derde karakter
      
$pos[3] = rand (175210); // locatie aanmaken (x-as) voor de vierde karakter
      
$pos[4] = rand (230265); // locatie aanmaken (x-as) voor de vijfde karakter
   
}
   
imagettftext ($image// image voorbereiden voor de image variabel ($image)
   
rand (1418), // fontgrootte, willekeurig getal laten kiezen tussen de 13 en 19
   
rand (-3030), // draaihoek, willekeur getal laten kiezen tussen de -31 en de 31
   
$pos[$i], // karakter positie breedte toewijzen, hebben we al voorbereid ($pos[])
   
rand (5020), // karakter positie hoogte, kiezen tussen de 51 en de 19
   
$fontcolor// fontkleur toewijzen, hebben we al voorbereid ($fontcolor)
   
$aFonts[rand (03)], // font, willekeurig font toewijzen uit de array ($aFonts)
   
$aCode[$i]); // code toewijzen, op volgorde van de array
}
imagepng ($image'captcha.png'); // de .png image aanmaken als captcha.png
imagedestroy ($image); // de handel afronden, en klaar!
?> 

top


4. Nader Uitleg Functies

Alle gebruikte functies zijn terug te vinden op php.net. Ik heb alle functies die gebruikt zijn in mijn captcha dus even op een rijtje gezet, zodat je ze makkelijk terug kunt vinden voor meer uitleg.
imagecreatetruecolor(); array(); count(); str_split(); imagecollorallocate(); rand (); imagettftext(); imagepng(); imagedestroy();

top


5. Toepassings Voorbeeld

Hier heb je een voorbeeld hoe je deze captcha kunt toepassen, alhoewel je hem wel eerst even in een funtie moet plaatsen. Noem de functie even 'captcha_generator ();'. Ik geef even een script voor het genereren van een code, zodat je die kan gebruiken.

<?PHP

function code_generator($length)
{
    
$generated_key "";
    while (
strlen($generated_key) < $length)
    {
        
$generate mt_rand(4890);
        if (
$generate 58 || $generate 64$generated_key .= strtolower(chr($generate));
    }
    return 
$generated_key;
}

?>
Nu ga je naar je bestand toe waar je de captcha wilt plaatsen, en daar doe je het volgende:
<?PHP
if ($_SERVER['REQUEST_METHOD'] != "POST"// Controleren of er niet ergens is gedrukt op een knop
{
   
// er is nergens op een knop gedrukt, maar gewoon handmatig gerefreshed..
   
$_SESSION['code'] = ""// de $_SESSION['code'] leeg gooien
   
$code code_generator(rand (4,5)); // een nieuwe key maken
}
if (empty (
$_SESSION['code'])) // controleren of de sessie leeg is
{
   
// de sessie is leeg, de code toewijzen aan de sessie
   
$_SESSION['code'] = $code;
}
captcha_generator ($_SESSION['code']); // het genereren van de image
echo '<img src="captcha.png" alt="">'// captcha image weergeven
?> 
Je zult met sessions moeten werken, anders wordt de variabel bij het submitten steeds overschreven, en dan zou het nooit werken. Nu zul je een formulier moeten maken, die later wordt gecontroleerd met de $_SESSION['code']. Houd er rekening mee dat, dat als er iets fout is ingevoerd (dus ook de captcha inhoud) dat je de $_SESSION['code'] leeg gooit! Doe je dat niet, dan krijg je elke keer bij het submitten dezelfde code, en dat wil je niet neem ik aan. Succes ermee zou ik zeggen.

top


6. Nawoord

Ik hoop dat mensen die deze tutorial gebruiken, da die hier flink wat verder mee komen. Mocht je nog vragen hebben, kan je die altijd op het forum posten. Mocht je onduidelijkheden tegen komen tijdens de tutorial zelf, dan kan je die altijd bij de reacties plaatsen over deze tutorial zodat ik dit kan aanpassen! Mocht je fouten tegen komen, breng mij daar dan ook een van op de hoogte. Bronnen: sitemasters.be, php.net, wikipedia.com, ervaring
Code Generator: door Arnold

Nrzonline

top



« Vorige tutorial : Zend Framework deel 2 Volgende tutorial : Loginsysteem »

© 2002-2021 Sitemasters.be - Regels - Laadtijd: 0.04s