<?php // Plug-in 34: Check Captcha // This is an executable example with additional code supplied // To obtain just the plug-ins please click on the Download link $salt1 = substr(md5(rand()), 0, 5); $salt2 = substr(md5(rand()), 0, 5); $result = PIPHP_CreateCaptcha(26, rand(4,8), 'captcha.ttf', '', $salt1, $salt2); $captcha = $result[0]; $token = $result[1]; $image = $result[2]; echo "The Captcha is '$captcha', the token is:<br />"; echo "'$token', and the image is in:<br />$image:<br />"; echo "<img src=\"$image\"><br />"; ob_flush(); flush(); sleep(2); // Wait for image to display $guess = "letmein"; $test = PIPHP_CheckCaptcha($guess, $token, $salt1, $salt2); if ($test == TRUE) echo "Captcha '$guess' passed<br />"; else echo "Captcha '$guess' failed<br />"; $test = PIPHP_CheckCaptcha($captcha, $token, $salt1, $salt2); if ($test == TRUE) echo "Captcha '$captcha' passed"; else echo "Captcha '$captcha' failed"; function PIPHP_CheckCaptcha($captcha, $token, $salt1, $salt2) { // Plug-in 34: Check Captcha // // This plug-in takes a Captcha string as entered by a user, // along with a special token and filename to verify the user // as human. The plug-in returns TRUE if the Captcha matches, // otherwise FALSE. The arguments required are: // // $captcha: Captcha as typed by user // $token: Token supplied by CreateCaptcha // $salt1: Same as supplied to CreateCaptcha // $salt2: Same as supplied to CreateCaptcha return $token == md5("$salt1$captcha$salt2"); } // The plug-ins below are in this file to ensure they // are available to the main plug-in which uses them function PIPHP_CreateCaptcha($size, $length, $font, $folder, $salt1, $salt2) { // Plug-in 33: Create Captcha // // This plug-in creates a GIF image containing a word the // user must type in to prove they are not a program. The // function returns a three element array containing the // following: // // Element 0: The Captcha word to be entered // Element 1: A unique 32 character token // Element 2: The location of a GIF file with the Captcha // text // // The function expects a file dictionary.txt to exist in the // current folder. This must be a text file of words separated // by \r\n carriage return, line feed pairs. The arguments // required are: // // $size: Font size for the Captcha // $length: Length of Captcha in letters // $font: Location of a TrueType font // $folder: Location of a temporary, web- // accessible folder to store the // captcha GIF. Must end with / // $salt1: A sequence of characters to help // make the Captcha uncrackable // $salt2: A second sequence to make it even // less crackable $file = file_get_contents('dictionary.txt'); $temps = explode("\r\n", $file); $dict = array(); foreach ($temps as $temp) if (strlen($temp) == $length) $dict[] = $temp; $captcha = $dict[rand(0, count($dict) - 1)]; $token = md5("$salt1$captcha$salt2"); $fname = "$folder" . $token . ".gif"; PIPHP_GifText($fname, $captcha, $font, $size, "444444", "ffffff", $size / 10, "666666"); $image = imagecreatefromgif($fname); $image = PIPHP_ImageAlter($image, 2); $image = PIPHP_ImageAlter($image, 13); for ($j = 0 ; $j < 3 ; ++$j) $image = PIPHP_ImageAlter($image, 3); for ($j = 0 ; $j < 2 ; ++$j) $image = PIPHP_ImageAlter($image, 5); imagegif($image, $fname); return array($captcha, $token, $fname); } function PIPHP_GifText($file, $text, $font, $size, $fore, $back, $shadow, $shadowcolor) { // Plug-in 19: Gif Text // // This plug-in accepts text input and then turns it into // a gif image. Various font sizes and effects are available // The arguments are: // // $file: The path and file to save the finished gif // $text: The text to display // $font: Filename of a TTF font file // $size: Font size to use // $fore: The foreground color // $back: The background color // $shadow: 0 = None, 1 or more = The offset to use // $shadowcolor: The shadow color (if selected) $bound = imagettfbbox($size, 0, $font, $text); $width = $bound[2] + $bound[0] + 6 + $shadow; $height = abs($bound[1]) + abs($bound[7]) + 5 + $shadow; $image = imagecreatetruecolor($width, $height); $bgcol = PIPHP_GD_FN1($image, $back); $fgcol = PIPHP_GD_FN1($image, $fore); $shcol = PIPHP_GD_FN1($image, $shadowcolor); imagefilledrectangle($image, 0, 0, $width, $height, $bgcol); if ($shadow > 0) imagettftext($image, $size, 0, $shadow + 2, abs($bound[5]) + $shadow + 2, $shcol, $font, $text); imagettftext($image, $size, 0, 2, abs($bound[5]) + 2, $fgcol, $font, $text); imagegif($image, $file); } function PIPHP_GD_FN1($image, $color) { return imagecolorallocate($image, hexdec(substr($color, 0, 2)), hexdec(substr($color, 2, 2)), hexdec(substr($color, 4, 2))); } function PIPHP_ImageAlter($image, $effect) { // Plug-in 14: Image Alter // // This plug-in takes a GD image and modifies it // according to the selected effect. The arguments are: // // $image: The image source // $effect: The effect to use between 1 and 14: // 1 = Sharpen // 2 = Blur // 3 = Brighten // 4 = Darken // 5 = Increase Contrast // 6 = Decrease Contrast // 7 = Grayscale // 8 = Invert // 9 = Increase Red // 10 = Increase Green // 11 = Increase Blue // 12 = Edge Detect // 13 = Emboss // 14 = Sketchify switch($effect) { case 1: imageconvolution($image, array(array(-1, -1, -1), array(-1, 16, -1), array(-1, -1, -1)), 8, 0); break; case 2: imagefilter($image, IMG_FILTER_GAUSSIAN_BLUR); break; case 3: imagefilter($image, IMG_FILTER_BRIGHTNESS, 20); break; case 4: imagefilter($image, IMG_FILTER_BRIGHTNESS, -20); break; case 5: imagefilter($image, IMG_FILTER_CONTRAST, -20); break; case 6: imagefilter($image, IMG_FILTER_CONTRAST, 20); break; case 7: imagefilter($image, IMG_FILTER_GRAYSCALE); break; case 8: imagefilter($image, IMG_FILTER_NEGATE); break; case 9: imagefilter($image, IMG_FILTER_COLORIZE, 128, 0, 0, 50); break; case 10: imagefilter($image, IMG_FILTER_COLORIZE, 0, 128, 0, 50); break; case 11: imagefilter($image, IMG_FILTER_COLORIZE, 0, 0, 128, 50); break; case 12: imagefilter($image, IMG_FILTER_EDGEDETECT); break; case 13: imagefilter($image, IMG_FILTER_EMBOSS); break; case 14: imagefilter($image, IMG_FILTER_MEAN_REMOVAL); break; } return $image; } ?>
插件说明:插件将对用户输入的验证字进行验证。这个验证字是由插件33创建的。插件34需要以下参数:
$captcha 用户输入的验证字
$token代表当前验证字的标志
$salt1第一个salt字符串
$salt2第二个salt字符串