Bra att ha Captcha funktion!
Postat: 10 nov 2011 13:52
Hej! Tänkte dela med mig av en captcha funktion.
Hoppas nån har nytta av de
För att skydda mot spam, så har vi här en captcha funktion. Först kommer själva funktionen.
Sammanfattning:
- Funktionen genererar en random teckenföljd (först str_shuffle, sedan mt_rand).
- Sedan skapas en bild med en "prickig" bakgrund, på denna skrivs tecknen, deras vridning, position (x & y) är random enligt mt_rand.
- Positioner och teckenstorlek anpassas till bildens storlek (inte helt perfekt dock)
Läs komments i koden för lite tips etc:
Del två, UI (bara ett exempel):
Behövs en del förbättringar, ge gärna kritik
Hoppas nån har nytta av de
För att skydda mot spam, så har vi här en captcha funktion. Först kommer själva funktionen.
Sammanfattning:
- Funktionen genererar en random teckenföljd (först str_shuffle, sedan mt_rand).
- Sedan skapas en bild med en "prickig" bakgrund, på denna skrivs tecknen, deras vridning, position (x & y) är random enligt mt_rand.
- Positioner och teckenstorlek anpassas till bildens storlek (inte helt perfekt dock)
Läs komments i koden för lite tips etc:
Kod: Markera allt
<?php
if(isset($_SESSION["captcha_s"])) {} else { session_start(); }
function create_image($CFG_PRIVKEY, $width = 300, $height = 150) {
/*ifall du har en font som har svårt att skilja på tecken (ex: l och 1), så är det bara ta bort dessa två tas bort*/
$characters = str_shuffle('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy0123456789');
$res = array();
for ($p = 0; $p < 4; $p++){$res[$p] = $characters[mt_rand(0, 54)];}
$sess = sha1($CFG_PRIVKEY.implode($res));
$_SESSION["captcha_s"] = $sess;
$image = ImageCreate($width, $height);
$white = ImageColorAllocate($image, 255, 255, 255);
$black = ImageColorAllocate($image, 0, 0, 0);
$red = ImageColorAllocate($image, 255, 111, 0);
$green = ImageColorAllocate($image, 0, 255, 0);
$pur = ImageColorAllocate($image, 255, 0, 255);
$medgray = imagecolorallocate($image, 180, 180, 180);
$fonts = array('font_ya','font_action','font_sketch_block','font_crackin');/*byt ut till namnen på dina fonts*/
$fontsiz = ceil($width/9);
$size = mt_rand($fontsiz-2, $fontsiz+4);
$cnt = ($width*$height)/mt_rand(5,10);
$colours = array($white, $green, $red, $pur);
$bnw = array($white, $black);
ImageFill($image, 0, 0, $black);
$y1=ceil($height*0.29);
$y2=$height-$y1;
imagettftext($image, $size, mt_rand(20,-20), mt_rand(1,ceil($width*0.10)), mt_rand($y1,$y2), $colours[mt_rand(0,3)], $fonts[mt_rand(0,3)], $res[0]); //img, size, angle, x, y, color, font, val
imagettftext($image, $size, mt_rand(20,-20), mt_rand(ceil($width*0.2),ceil($width*0.35)), mt_rand($y1,$y2), $colours[mt_rand(0,3)], $fonts[mt_rand(0,3)], $res[1]);
imagettftext($image, $size, mt_rand(20,-20), mt_rand(ceil($width*0.5),ceil($width*0.65)), mt_rand($y1,$y2), $colours[mt_rand(0,3)], $fonts[mt_rand(0,3)], $res[2]);
imagettftext($image, $size, mt_rand(20,-20), mt_rand(ceil($width*0.8),ceil($width*0.85)), mt_rand($y1,$y2), $colours[mt_rand(0,3)], $fonts[mt_rand(0,3)], $res[3]);
for($i=0;$i<$cnt;$i++) {
imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $bnw[mt_rand(0,1)]);
imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $colours[mt_rand(0,3)]);
//imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $colours[mt_rand(0,3)]);
/*imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $pur);
imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $green);
imagefilledellipse($image, mt_rand(0,$width), mt_rand(0,$height), 1, 1, $red);*/
}
header("Content-Type: image/jpeg");
ImageJpeg($image);
ImageDestroy($image);
}
create_image('bf2df0a81ca329u320def05ede1dff9a475632d900u23d');/*privat nyckel, ganska overkill, men kan vara roligt för dig som vill ha en unik captcha nyckel för varje användare exempelvis (gör det onödigt säkert)*/
exit();
?>
Kod: Markera allt
if(isset($_POST['captcha'])) {
$CFG_PRIVKEY = 'bf2df0a81ca329u320def05ede1dff9a475632d900u23d';
if($_SESSION['captcha_s'] != sha1($CFG_PRIVKEY.$_POST['captcha'])) {
die('Du hamna i robot-fällan ^_^');
} else { die('hej human:)'); }
} else {
$_SESSION['captcha_s'] = '';
?>
<script>
function reloadcapt() {
var x = 1 * document.getElementById("capt").src.substr(-1,1) + 1;
if(x > 16) {alert("Sluta uppdatera, tack.");return false;}
document.getElementById("capt").src="inc/captcha/image.php?x="+x;/*ändra till captchans dir*/
}
</script>
<div class="bgtop"><h1>Testa ifall du är en robot</h1></div>
<div class="content">
<form action="user_robot.php" method="post">
<table>
<tr><td valign="bottom">Säkerhetskod:</td><td><a href="javascript:void(0);" onclick="javascript:reloadcapt();"><img src="inc/captcha/image.php?x=1" id="capt" alt="fail" /><!--ändra här med--></a><br />Oläsbart? Klicka på bilden för att byta bild.<br />4 tecken, skriftlägeskänsligt.<br /><input type="text" name="captcha" /></td></tr>
<tr><td colspan="2"><input type="submit" value="Gooo!" /></td></tr>
</table>
</form>
</div>
<div class="bgbottom"></div>
</body>
</html>
<?php
}
?>