Scripts
Captcha
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
captcha
[b]de pagina waarop je de captcha wil hebben[/b]
[code]
<?php
session_start(); //even zorgen dat we met sessies kunnen gaan werken
error_reporting(E_ALL);
ini_set('display_errors', 1);
?>
<html>
<head>
<script language="javascript" type="text/javascript">
function nieuw()
{
document.getElementById('captcha').innerHTML = '<img src="afbeelding.php?' + Math.floor(Math.random()* 999999 + 1 ) + '" height="45px" width="108px" />';
}
</script>
</head>
<body>
<div id="lipsum">
<p> Lorem ipsum dolor sit amet, consectetuer adipiscing elit. In mi enim, consectetuer a, imperdiet vitae, pulvinar a, sapien. Quisque urna purus, ornare sed, iaculis ut, iaculis id, erat. Vivamus laoreet velit sit amet urna. Etiam porta. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Vestibulum accumsan tincidunt turpis. Ut lobortis nisi eget erat. Integer tincidunt. Donec id dolor ac leo ultrices molestie. Aenean ligula. Fusce pretium, orci quis ultricies dictum, velit velit tempus mi, sed porttitor lacus dolor in mauris. Aliquam sed pede. Aenean neque. Nam iaculis posuere nisl. Ut non nibh a mauris congue faucibus. Quisque quis urna vitae sem tempus scelerisque. Mauris orci neque, malesuada nec, interdum ac, mattis ut, tortor. Proin ullamcorper. Maecenas mi. </p>
<p>Nunc at velit sed mauris rhoncus cursus. Ut id lorem. Pellentesque sem. Phasellus eu massa eu mi semper scelerisque. Morbi posuere tincidunt sapien. Mauris dolor mauris, pretium sed, venenatis nec, rutrum non, erat. Nullam pellentesque tellus nec quam. Mauris metus justo, elementum eu, ornare quis, blandit eu, nulla. Proin aliquam sodales quam. Sed condimentum diam nec nisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Aliquam in elit quis enim eleifend porttitor. Fusce in augue nec massa vulputate aliquet. Morbi et sem. Aliquam sodales eleifend sem. Quisque eleifend. Maecenas mollis. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos hymenaeos. Etiam tempor quam at tellus. Etiam quis risus. </p>
</div>
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') //als er gepost is
{
/*
Hier kun je afhandeling zetten die ook moet gebeuren als de code niet goed is.
Hier kun je dus bijvoorbeeld je formulier in een sessie zetten zodat alles wordt onthouden
Zelf zet hier de geposte naam in een sessie.
TIP -- TIP -- TIP
Zet hier geen POST to SESSION foreach neer!
*/
if(!isset($_SESSION['naam']))
{
$_SESSION['naam'] = $_POST['naam'];
}
if(!empty($_POST['cap']) && md5($_POST['cap']) == $_SESSION['string']) //als de geposte code niet leeg is, en gelijk is aan de md5 van de sessie
{
/*
hier kun je je eigen formulier afhandeling zetten,
ik doe nu de afhandeling van de naam, maar deze kun je uiteraard verwijderen
en voor in de plaats zetten wat je zelf wilt
*/
if(isset($_SESSION['naam'])) //als de sessie naam is geset
{
echo 'Je naam is: '.$_SESSION['naam']; //echo de naam
unset($_SESSION); //en unset de sessie
}
else //als de sessie niet is geset
{
echo 'Je naam is: '.$_POST['naam']; //echo de geposte naam
unset($_SESSION); //en unset de sessie
}
}
else //als de code verkeerd is
{
echo 'verkeerde code<br /><br />';
echo '<form action="#" method="post"><label>
<span id="captcha">
<img src="afbeelding.php" height="45px" width="108px" />
</span>
<input type="text" size="10" maxlength="10" name="cap" />
</label>
<br />
<br />
<input type="submit" value="Voer uit!" />
</form>
<br />
<a onclick="javascript: nieuw()" style="cursor: pointer; text-decoration: underline;">nieuwe afbeelding</a>
'; //echo dat het formulier verkeerd is en geef een nieuwe code
}
}
else //als er niet gesubmit is
{
//geef dan het gewone formulier
?>
<form action="#" method="post">
<label>Naam: <input type="text" name="naam" /></label><br />
<br />
<label>
<span id="captcha">
<img src="afbeelding.php" height="45" width="108" /> </span>
<input type="text" size="10" maxlength="10" name="cap" />
</label>
<br />
<br />
<input type="submit" value="Voer uit!" />
</form>
<br />
<a onClick="javascript: nieuw()" style="cursor: pointer; text-decoration: underline;">nieuwe afbeelding</a>
<?php
}
?>
</body>
</html>
[/code]
[b]afbeelding.php[/b]
[code]
<?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('poorrichard.ttf','tccm.ttf','times.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
?>
[/code]
Reacties
0