PHP实现验证码制作
captcha.php(PHP产生验证码并储存Session):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | <?php //开启Session session_start(); //绘制底图 $image = imagecreatetruecolor(100, 30); //返回资源型的值 $bgcolor = imagecolorallocate( $image , 255, 255, 255); //创建一个底图 imagefill( $image , 0, 0, $bgcolor ); //区域填充 /* //输出随机数字 for($i = 0; $i < 4; $i++){ $fontsize = 6;//字体大小 $fontcolor = imagecolorallocate($image, rand(0, 120), rand(0, 120), rand(0, 120));//字体颜色 $fontcontent = rand(0, 9);//字符串内容 $x = ($i*100/4) + rand(5, 10);//数字的横坐标 $y = rand(5, 10);//数字的纵坐标 imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor);//在图像资源上绘制字符 } */ //产生随机字符串 $captch_code = '' ; for ( $i = 0; $i < 4; $i ++){ $fontsize = 6; //字体大小 $fontcolor = imagecolorallocate( $image , rand(0, 120), rand(0, 120),rand(0, 120)); //字体颜色 $data = '23456789ABCDEFGHJKLMNOPQRTUVWXYZabcdefghjkmnopqrtuvwxy' ; //随机字符串的字典 $fontcontent = substr ( $data , rand(0, strlen ( $data )), 1); //字符 $captch_code .= $fontcontent ; //拼接字符串 $x = ( $i *100/4) + rand(5, 10); //字符横坐标 $y = rand(5, 10); //字符纵坐标 //在图像资源上绘制字符 imagestring( $image , $fontsize , $x , $y , $fontcontent , $fontcolor ); } //将验证码字符串存储在Session $_SESSION [ 'authcode' ] = $captch_code ; //点干扰 for ( $i = 0; $i < 200; $i ++){ $pointcolor = imagecolorallocate( $image , rand(50, 200), rand(50, 200), rand(50, 200)); imagesetpixel( $image , rand(1, 99), rand(1, 99), $pointcolor ); } //线干扰 for ( $i = 0; $i < 6; $i ++){ $linecolor = imagecolorallocate( $image , rand(80, 220), rand(80, 220), rand(80, 220)); imageline( $image , rand(1, 99), rand(1, 99), rand(1, 99), rand(1, 99), $linecolor ); } //输出图片内容 header( 'content-type:image/png' ); //输出内容的格式 imagepng( $image ); //输出内容 imagedestroy( $image ); //销毁资源 ?> |
captcha-form.html(Web表单验证):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | <!DOCTYPE html> <html> <head> <meta charset= "utf-8" > <title>验证码</title> </head> <body> <form method= "post" action= "./captcha-result.php" > <p> 验证码图片: <img id= "captcha-img" border= "1" src= "./captcha.php?r=0" > <a href= "javascript:void(0);" onclick= "getCaptchaImg();" >看不清</a> </p> <p>请输入图片中的内容:<input id= "authcode" type= "text" name= "authcode" value= "" ></p> <p><input type= "submit" value= "提交" style= "padding:6px 20px;" ></p> </form> <script> //动态获取验证码 function getCaptchaImg(){ //从服务器获取新的验证码 document.getElementById( 'captcha-img' ).src= './captcha.php?r=' +Math.random(); //清空文本框里已输入的内容 document.getElementById( 'authcode' ).value= "" ; } </script> </body> </html> |
生成的验证码:
captcha-result.php(PHP判断验证码是否正确):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | <?php //验证验证码是否正确 if (isset( $_REQUEST [ 'authcode' ])){ //开启Session session_start(); //strtolower()将字符串都转换成小写,将验证码设置为不区分大小写型 if ( strtolower ( $_REQUEST [ 'authcode' ]) == strtolower ( $_SESSION [ 'authcode' ])){ echo "输入正确" ; } else { echo "输入错误" ; } exit (); } ?> |
所用到的函数原型:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | <?php //imagecreatetruecolor() 返回一个图像标识符,代表了一幅大小为 x_size 和 y_size 的黑色图像。 resource imagecreatetruecolor ( int $width , int $height ); //imagecolorallocate() 返回一个标识符,代表了由给定的 RGB 成分组成的颜色。red,green 和 blue 分别是所需要的颜色的红,绿,蓝成分。 int imagecolorallocate ( resource $image , int $red , int $green , int $blue ); //imagefill() 在 image 图像的坐标 x,y(图像左上角为 0, 0)处用 color 颜色执行区域填充(即与 x, y 点颜色相同且相邻的点都会被填充)。 bool imagefill ( resource $image , int $x , int $y , int $color ); //imagestring() 用 col 颜色将字符串 s 画到 image 所代表的图像的 x,y 坐标处(这是字符串左上角坐标,整幅图像的左上角为 0,0)。如果 font 是 1,2,3,4 或 5,则使用内置字体。 bool imagestring ( resource $image , int $font , int $x , int $y , string $s , int $col ); //imagesetpixel() 在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。 bool imagesetpixel ( resource $image , int $x , int $y , int $color ); //imageline() 用 color 颜色在图像 image 中从坐标 x1,y1 到 x2,y2(图像左上角为 0, 0)画一条线段。 bool imageline ( resource $image , int $x1 , int $y1 , int $x2 , int $y2 , int $color ); //imagepng() 将 GD 图像流(image)以 PNG 格式输出到标准输出(通常为浏览器),或者如果用 filename 给出了文件名则将其输出到该文件。 bool imagepng ( resource $image [, string $filename ] ); //imagedestroy() 释放与 image 关联的内存。image 是由图像创建函数返回的图像标识符,例如 imagecreatetruecolor()。 bool imagedestroy ( resource $image ); ?> |
本文链接:https://www.cnblogs.com/connect/p/php-captcha-image.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?