Bra att ha Captcha funktion!

PHP kan diskuteras här.

Moderatorer: Nille, Minime

aeeew
Besökare
Poster: 6
Blev medlem: 10 Nov 2011 12:41

Bra att ha Captcha funktion!

Posta av aeeew » 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:

Kod: Välj alla

<?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();

?>
Del två, UI (bara ett exempel):

Kod: Välj alla

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
}
?>
Behövs en del förbättringar, ge gärna kritik :)

Skriv Svar