From dd02492f08248bf9b53a20b54a3d49a9f78fc0ad Mon Sep 17 00:00:00 2001 From: xue <> Date: Wed, 29 Aug 2007 19:57:50 +0000 Subject: finished TCaptcha. --- framework/Web/UI/WebControls/assets/captcha.php | 169 +++++++++++++++++++----- 1 file changed, 138 insertions(+), 31 deletions(-) (limited to 'framework/Web/UI/WebControls/assets') diff --git a/framework/Web/UI/WebControls/assets/captcha.php b/framework/Web/UI/WebControls/assets/captcha.php index 3941eb44..2a4952a9 100644 --- a/framework/Web/UI/WebControls/assets/captcha.php +++ b/framework/Web/UI/WebControls/assets/captcha.php @@ -10,9 +10,17 @@ * @package System.Web.UI.WebControls.assets */ +define('THEME_OPAQUE_BACKGROUND',0x0001); +define('THEME_NOISY_BACKGROUND',0x0002); +define('THEME_HAS_GRID',0x0004); +define('THEME_HAS_SCRIBBLE',0x0008); +define('THEME_MORPH_BACKGROUND',0x0010); + require_once(dirname(__FILE__).'/captcha_key.php'); $token='error'; +$theme=0; + if(isset($_GET['options'])) { $str=base64_decode($_GET['options']); @@ -27,12 +35,14 @@ if(isset($_GET['options'])) $tokenLength=$options['tokenLength']; $caseSensitive=$options['caseSensitive']; $alphabet=$options['alphabet']; + $fontSize=$options['fontSize']; + $theme=$options['theme']; $token=generateToken($publicKey,$privateKey,$alphabet,$tokenLength,$caseSensitive); } } } -displayToken($token); +displayToken($token,$fontSize,$theme); function generateToken($publicKey,$privateKey,$alphabet,$tokenLength,$caseSensitive) { @@ -40,10 +50,10 @@ function generateToken($publicKey,$privateKey,$alphabet,$tokenLength,$caseSensit return $caseSensitive?$token:strtoupper($token); } -function hash2string($hex,$alphabet='') +function hash2string($hex,$alphabet) { if(strlen($alphabet)<2) - $alphabet='234578adefhijmnrtABDEFGHJLMNQRT'; + $alphabet='234578adefhijmnrtABDEFGHJLMNRT'; $hexLength=strlen($hex); $base=strlen($alphabet); $result=''; @@ -59,47 +69,144 @@ function hash2string($hex,$alphabet='') return $result; } -function displayToken($token) +function displayToken($token,$fontSize,$theme) { + if(($fontSize=(int)$fontSize)<22) + $fontSize=22; + if($fontSize>100) + $fontSize=100; $length=strlen($token); - $width=45*$length; - $height=70; + $padding=10; + $fontWidth=$fontSize; + $fontHeight=floor($fontWidth*1.5); + $width=$fontWidth*$length+$padding*2; + $height=$fontHeight; $image=imagecreatetruecolor($width,$height); + + addBackground + ( + $image, $width, $height, + $theme&THEME_OPAQUE_BACKGROUND, + $theme&THEME_NOISY_BACKGROUND, + $theme&THEME_HAS_GRID, + $theme&THEME_HAS_SCRIBBLE, + $theme&THEME_MORPH_BACKGROUND + ); + $font=dirname(__FILE__).DIRECTORY_SEPARATOR.'verase.ttf'; - $vred=rand(0,100); - $vgreen=rand(0,100); - $vblue=rand(0,100); + + if(function_exists('imagefilter')) + imagefilter($image,IMG_FILTER_GAUSSIAN_BLUR); + + for($i=0;$i<$length;$i++) + { + $color=imagecolorallocate($image,rand(150,220),rand(150,220),rand(150,220)); + imagettftext($image,rand($fontWidth-10,$fontWidth),rand(-30, 30),$padding+$i*$fontWidth,rand($fontHeight-15,$fontHeight-10),$color,$font,$token[$i]); + imagecolordeallocate($image,$color); + } + + imagepng($image); + imagedestroy($image); +} + +function addBackground($image,$width,$height,$opaque,$noisy,$hasGrid,$hasScribble,$morph) +{ + $background=imagecreatetruecolor($width*2,$height*2); + $white=imagecolorallocate($background,255,255,255); + imagefill($background,0,0,$white); + + if($opaque) + imagefill($background,0,0,imagecolorallocate($background,100,100,100)); + + if($noisy) + addNoise($background,$width*2,$height*2); + + if($hasGrid) + addGrid($background,$width*2,$height*2); + + if($hasScribble) + addScribble($background,$width*2,$height*2); + + if($morph) + morphImage($background,$width*2,$height*2); + + imagecopy($image,$background,0,0,30,30,$width,$height); + + if(!$opaque) + imagecolortransparent($image,$white); +} + +function addNoise($image,$width,$height) +{ for($x=0;$x<$width;++$x) { for($y=0;$y<$height;++$y) { - $vred+=rand(-2,2); - $vgreen+=rand(-2,2); - $vblue+=rand(-2,2); - if($vred<0) $vred=0; if($vred>150) $vred=75; - if($vgreen<0) $vgreen=0; if($vgreen>150) $vgreen=75; - if($vblue<0) $vblue=0; if($vblue>150) $vblue=75; - $col = imagecolorallocate($image, $vred, $vgreen, $vblue); - imagesetpixel($image, $x, $y, $col); - imagecolordeallocate($image, $col); + if(rand(0,100)<25) + { + $color=imagecolorallocate($image,rand(150,220),rand(150,220),rand(150,220)); + imagesetpixel($image,$x,$y,$color); + imagecolordeallocate($image,$color); + } } } +} - imagefilter($image,IMG_FILTER_GAUSSIAN_BLUR); - for($i=0;$i<$length;$i++) +function addGrid($image,$width,$height) +{ + for($i=0;$i<$width;$i+=rand(15,25)) { - $vred = rand(150, 240); - $vgreen = rand(150, 240); - $vblue = rand(150, 240); - $col = imagecolorallocate($image, $vred, $vgreen, $vblue); - $char = $token[$i]; - imagettftext($image, rand(40, 50), rand(-10, 20), 13 + (40 * $i), rand(50, imagesy($image) - 10), $col, $font, $char); - imagecolordeallocate($image, $col); - } - imagefilter($image,IMG_FILTER_GAUSSIAN_BLUR); + imagesetthickness($image,rand(2,6)); + $color=imagecolorallocate($image,rand(100,180),rand(100,180),rand(100,180)); + imageline($image,$i+rand(-10,20),0,$i+rand(-10,20),$height,$color); + imagecolordeallocate($image,$color); + } + for($i=0;$i<$height;$i+=rand(15,25)) + { + imagesetthickness($image,rand(2,6)); + $color=imagecolorallocate($image,rand(100,180),rand(100,180),rand(100,180)); + imageline($image,0,$i+rand(-10,20),$width,$i+rand(-10,20),$color); + imagecolordeallocate($image,$color); + } +} - imagepng($image); - imagedestroy($image); +function addScribble($image,$width,$height) +{ + for($i=0;$i<8;$i++) + { + $color=imagecolorallocate($image,rand(100,180),rand(100,180),rand(100,180)); + $points=array(); + for($j=1;$j=$height) $y=$height-5; + if($y<0) $y=5; + imagecopy($tempImage,$image,$x,0,$x,$y,$chunk,$height); + } + for($x=$y=0;$y<$height;$y+=$chunk) + { + $chunk=rand(1,5); + $x+=rand(-1,1); + if($x>=$width) $x=$width-5; + if($x<0) $x=5; + imagecopy($image,$tempImage,$x,$y,0,$y,$width,$chunk); + } } ?> \ No newline at end of file -- cgit v1.2.3