php验证码核心是服务端生成并校验随机凭证:图形验证码需用random_int()生成4~6位字符串、gd库绘图、存入session;滑块验证需服务端生成缺口位置并加密存储,校验x坐标容差、时效及签名;所有判定必须服务端完成,禁用前端绕过。

PHP网站搭建验证码,核心在于服务端生成可验证的随机凭证,并与用户提交行为做一致性校验。图形验证码侧重图像干扰与文本识别,滑块验证侧重行为轨迹与位置匹配——两者都需服务端生成、存储、比对,不能仅靠前端逻辑。
图形验证码的PHP实现逻辑
服务端需完成三件事:生成带干扰的随机字符串、绘制为图片、记录该字符串到临时存储(如session或Redis)。
- 用
random_int()生成4~6位字母数字组合,避免易混淆字符(如0/O、1/l) - 使用GD库创建画布,添加噪点、干扰线、轻微旋转字体,再将文本写入图像
- 把生成的验证码字符串存入
$_SESSION['captcha_code'],并设置过期时间(如5分钟) - 输出图片时设置
header('Content-Type: image/png'),直接echo图像流,不保存文件 - 表单提交后,比对用户输入与
$_SESSION['captcha_code'],严格区分大小写,比对后立即清空session值
滑块验证的PHP后端关键逻辑
滑块验证不是纯前端动画,服务端必须参与生成挑战参数、验证拖动结果是否合理。
- 每次验证请求,服务端生成一个随机“缺口位置”(如120px)和对应“背景图+滑块图”的标识(如UUID),将缺口位置加密后存入session或Redis,有效期2分钟
- 前端拖动结束后,提交
x坐标、时间戳、客户端生成的简单签名(如x与时间拼接后取md5前8位) - 服务端取出存储的缺口位置,判断提交的
x是否在容差范围内(如±5px),同时校验时间是否超时、签名是否匹配 - 不依赖前端传来的“是否通过”布尔值,所有判定必须由服务端完成,防止绕过
安全增强的通用要点
验证码本质是人机区分机制,服务端控制权必须牢牢掌握。
- 禁用浏览器自动填充验证码字段,加
autocomplete="off"并动态改name属性 - 同一IP短时间频繁请求验证码,触发频率限制(如1分钟最多3次)
- 验证码校验失败达3次,临时锁定该session或IP,要求重新获取新验证码
- 生产环境禁用GD库的
imagepng()直接输出,改用base64嵌入或独立验证码接口,避免缓存污染
前后端协作注意事项
验证码不是孤立模块,需与登录、注册等流程无缝衔接。
- 每个验证码只允许验证一次,成功或失败后均应失效,防止重放
- 前端请求新验证码时,必须携带当前表单的唯一token(如form_id),服务端将其与验证码绑定,防止跨表单复用
- 滑块验证中,前端上报的坐标需经服务端映射回原始背景图尺寸(考虑缩放适配),不能直接比像素值
- 返回错误时,只提示“验证码错误”,不透露是图形错还是滑块错,也不反馈剩余尝试次数
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











