PHP 动态生成验证码
……机器人会在网站中搜寻允许他们插入广告的输入表单,在虚拟世界没有什么能阻挡它们胡作非为。这些机器人效率极高,完全不关心所攻击的表单的本来用途。它们唯一的目标就是用它们的垃圾广告覆盖你的内容,残忍地为它们的主人谋取广告收入。
要检验一个表单所面对的是一个真正的人,这种测试称为CAPTCHA(完全自动化公共图灵测试)。目前最有效的方法是生成一个要求用户输入的随机通行短语,为了防止支持OCR(光学字符识别)的机器人破解系统,通行短语字母必须变形,或者用随机的直线和点进行部分模糊处理。
/* 生成验证码序列 */ define("CAPTCHA_NUMCHARS", 6); //验证码长度 $pass_phrase = ""; //验证码内容 for ($i = 0; $i < CAPTCHA_NUMCHARS; $i++) { //随机生成字母添加至验证码 $pass_phrase .= chr(rand(97, 122)); } /* 生成验证码图像 */ define("CAPTCHA_WIDTH", 300); //验证码宽度 define("CAPTCHA_HEIGHT", 100); //验证码高度 //创建空白画布 $img = imagecreatetruecolor(CAPTCHA_WIDTH, CAPTCHA_HEIGHT); //设置主题颜色 $bg_color = imagecolorallocate($img, 225, 225, 225); //白色背景 $text_color = imagecolorallocate($img, 0, 0, 0); //黑色字体 $graphic_color = imagecolorallocate($img, 64, 64, 64); //灰色图像 //填充背景 imagefilledrectangle($img, 0, 0, CAPTCHA_WIDTH, CAPTCHA_HEIGHT, $bg_color); //绘制随机直线 for ($i = 0; $i < 10; $i++) { imageline($img, 0, rand() % CAPTCHA_HEIGHT, CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, $graphic_color); } //绘制随机点 for ($i = 0; $i < 20; $i++) { imagefilledellipse($img, rand() % CAPTCHA_WIDTH, rand() % CAPTCHA_HEIGHT, 10, 10, $graphic_color); } //绘制验证码 imagettftext($img, 60, 0, 20, CAPTCHA_HEIGHT - 20, $text_color, "C:/Windows/Fonts/SketchFlow Print.ttf", $pass_phrase); //作为PNG图像输出 header("Content-type: image/png"); imagepng($img); //从内存从撤销图像 imagedestroy($img);
使用PHP动态生成的图像并不存储在一个文件中,实际上,imagepng() 函数会在服务器的内存中生成一个二进制PNG图像,然后把它直接通过一个首部传送到浏览器。
正因如此可以直接把PHP脚本放置在 <img> 标记的 src 属性中:<img src = "CAPTCHA.php"/>