PHP生成验证码后需存入Session:先调用session_start()启用会话并生成随机字符串赋值给$_SESSION['captcha_code'];设置HttpOnly、Secure Cookie及过期时间;在captcha.php中输出图像前完成存储;验证成功后立即unset验证码;Session异常时需检测状态并报错。

当PHP生成验证码图像后,需要将对应的验证码字符串安全地保存到用户会话中,以便后续表单提交时进行比对验证。以下是将验证码存储到Session的具体操作步骤:
一、启用Session并生成随机验证码
在输出验证码图像前,必须先启动会话,确保Session可用,并生成一个由字母和数字组成的随机字符串作为验证码值。
1、调用 session_start() 函数开启会话。
2、使用 str_shuffle() 与 substr() 组合生成4至6位随机字符。
立即学习“PHP免费学习笔记(深入)”;
3、将生成的验证码字符串赋值给 $_SESSION['captcha_code'] 变量。
二、设置Session有效期与安全选项
为防止验证码被长期复用或跨会话窃取,需配置Session生命周期及传输安全参数。
1、在调用 session_start() 前,使用 ini_set('session.cookie_httponly', 1) 禁止JavaScript访问Session Cookie。
2、使用 ini_set('session.cookie_secure', 1) 强制Session Cookie仅通过HTTPS传输(若部署在HTTPS环境)。
3、设置验证码Session项的过期时间,例如在存储后立即写入 $_SESSION['captcha_time'] = time()。
三、在验证码图像脚本中完成存储
验证码图像通常由独立PHP文件(如captcha.php)动态生成,该文件需同时完成图像输出与Session写入。
1、在文件开头添加 session_start()。
2、生成验证码字符串并存入 $_SESSION['captcha_code']。
3、设置响应头 header('Content-Type: image/png') 并输出图像数据。
4、在输出图像后不执行 session_write_close(),除非后续无其他Session写入需求。
四、验证前清除已使用的验证码
为避免同一验证码被多次提交,应在用户提交表单并验证成功后立即销毁Session中的验证码值。
1、获取用户提交的验证码输入值,转换为小写并去除空格。
2、与 $_SESSION['captcha_code'] 进行严格比较(区分大小写)。
3、验证通过后,执行 unset($_SESSION['captcha_code']) 和 unset($_SESSION['captcha_time'])。
五、处理Session未启用或失败的情况
若服务器未启用Session或session_start()调用失败,验证码将无法持久化,必须提供明确的错误反馈路径。
1、检查 session_status() === PHP_SESSION_ACTIVE 判断Session是否已激活。
2、若返回 PHP_SESSION_NONE,则手动触发 session_start() 并捕获其返回值。
3、若 session_start() 返回false,向日志写入错误信息并终止脚本执行,不输出验证码图像。











