验证码大小写不敏感验证需统一转小写后用===比较,https下图片url须协议一致,中文验证码需usezh为true、zhset与utf-8字体路径三者齐全。

验证码字母大小写不敏感验证必须改比较逻辑
默认用 === 直接比对用户输入和 session 中保存的原始验证码,会因大小写不同直接失败。ThinkPHP 或原生 PHP 都不会自动忽略大小写。
最稳妥的做法是统一转小写再比:
- 读取用户提交的值,如
$_POST['captcha'] - 从
$_SESSION['captcha_code']或缓存中取出原始码 - 两个字符串都用
strtolower()处理(mb_strtolower()更安全,但需确认环境支持 UTF-8) - 用
===比较转换后的结果
别用 strcasecmp() ——它返回整数,容易误判为真值;也别只在生成时限制字符池为纯小写,那样中文、数字混合场景下仍可能出问题。
HTTPS 下验证码图片 URL 必须协议一致
如果页面是 https://,但验证码图片地址是 http://,浏览器会拦截混合内容,图片显示为空白或报错 Mixed Content: The page at 'https://...' was loaded over HTTPS, but requested an insecure image。
ThinkPHP 的 captcha.php 配置里,url 项不能写死 http:// 或相对路径:
- 推荐留空,让框架自动推导(多数版本支持)
- 若需手动指定,用
URL::build()或拼接$_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://' - 绝对不要写成
http://yourdomain.com/captcha—— 在 HTTPS 环境下必然挂掉
中文验证码在 HTTPS 页面上显示为方块?检查三个硬性条件
不是字体没加载,而是缺一不可的三要素没齐:
-
useZh配置项必须为true -
zhset字体文件路径必须是服务器上的绝对路径(如/var/www/font/simhei.ttf),且 PHP 进程有读取权限 - 字体本身必须是 UTF-8 兼容的 TrueType 字体(
simhei.ttf、msyh.ttc可用;arial.ttf不行)
常见坑:开发环境用的是 Windows 路径 C:\font\simhei.ttf,上线到 Linux 就失效;或者把字体放在 web 目录下,用 URL 地址赋给 font_path —— 图像函数只认本地文件系统路径,不认 HTTP 地址。
cURL 请求带验证码的 HTTPS 接口时证书报错
调用第三方接口(比如打码平台上传验证码图)走 HTTPS,curl_exec() 报 SSL certificate problem, verify that the CA cert is OK,本质是 cURL 默认校验证书链,而目标服务用了自签名或过期证书。
生产环境不该关验证,但调试阶段可临时绕过:
- 加
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false)(关证书有效性) - 加
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false)(关域名匹配) - 更稳妥的做法是下载最新 CA 包(如 cacert.pem),然后设置
curl_setopt($ch, CURLOPT_CAINFO, '/path/to/cacert.pem')
注意:CURLOPT_SSL_VERIFYHOST 设为 true 时,值必须是 2(新版 cURL 已弃用 true 写法),设成 1 会退化为只检查证书是否存在,不校验域名 —— 这个细节很多人踩过坑。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











