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
}
?>