PHP 如何做验证码
在网站登录、注册或提交敏感操作时,验证码是最常见的“防机器人”工具——它就像门口的保安,能快速区分真人操作和恶意程序。很多人以为验证码是复杂的图片技术,其实用PHP做一套基础验证码,只需要几步简单操作,连新手都能快速上手。
先搞懂核心逻辑:PHP做验证码的本质,是用代码生成一张带随机字符的图片,同时把字符存在会话里,等用户输入后再比对验证。整个过程不需要专业绘图工具,只靠PHP的GD图形库就能完成——这个库几乎所有PHP环境都默认开启,不用额外安装。

第一步:生成随机字符,存进会话
要让每次验证码都不一样,得先造一串随机的“验证文本”。我们可以用PHP的mt_rand()函数生成数字加字母的组合,避免全是数字太简单、全是字母太难认的问题。这些字符不能随便丢,得存在$_SESSION里,因为会话能在用户和服务器之间传递数据,等用户提交表单后,才能把输入的内容和会话里的真实内容比对。
举个生活化的例子:这就像前台给你发了一张带唯一编号的“入场券”,你进门时得把票拿出来核对,后台要先把编号记在你的专属“信息袋”(会话)里,不能随便放桌上让别人改。
第二步:生成带干扰的验证码图片
有了随机字符,接下来要把文字变成一张图片。PHP有个专门的函数imagecreatetruecolor(),能创建自定义大小的黑色图片。然后给图片加个白色背景,再用imagestring()把之前存的随机字符画上去——这就像在入场券上印上唯一编号。
为了不让机器人轻易识别字符,得加一点“干扰项”:比如画几条歪歪扭扭的黑线,或者随机加一些小的彩色点。这些干扰项不会影响真人看,却能拦住靠OCR(光学识别)自动读取字符的机器人。就像给入场券画几笔乱码,只有能看懂的真人能识别,机器读不出来。
最后别忘了设置图片的格式,用imagepng()输出成PNG图片,再用imagedestroy()释放内存——不然服务器会一直占着资源,影响速度。
第三步:做验证逻辑,比对用户输入
等用户在表单里输入验证码并提交后,要做的就是比对输入的内容和会话里的真实字符。这里要注意两个细节:一是不区分大小写,比如用户输入小写的“a”和大写的“A”都算对;二是用完会话里的字符就删掉,避免重复验证的漏洞。
举个实际的场景:你去超市取快递,前台给了你一张取件码纸条,你报完码取到快递后,前台就把你那张纸条的记录删掉,下次不能用同一张纸条再取。这样能防止有人偷用旧记录。
常见的小坑和优化小技巧
新手做验证码时,容易踩两个坑:一是没开GD库,这会直接导致图片生成失败,检查的方法是在PHP文件里加一行phpinfo();,找“GD Support”这一项,显示“enabled”就正常;二是会话没启动,必须在生成验证码图片的文件开头加session_start();,不然存不了随机字符。
另外还可以做些小优化:比如把字符的角度稍微倾斜,或者让文字大小略有不同,这样更难被机器识别,真人看也不费劲。如果是用在高安全需求的场景(比如找回密码),还可以在字符里加几个容易混淆的字母,比如“0”和“O”,但要记得在验证逻辑里说明,避免用户输错。
这套基础验证码的流程,是所有高级验证码的核心逻辑——不管是滑动验证码、语音验证码,本质都是“生成唯一凭证+核对凭证”的思路。如果你是第一次做网站,用这个方法就能快速实现基础的防机器人功能,不用找第三方工具,还能自己灵活修改样式。