密码哈希方式需根据数据库password字段长度确定:32位多为裸md5或加盐md5,60位开头$2y$/$2a$则为password_hash();登录验证必须严格匹配注册时的哈希逻辑,不可混用;session与权限跳转须分离,权限字段须源自数据库;验证码异常多因session配置错误;上线后哈希方式不可随意切换,升级需双轨兼容。

密码字段长度决定加密方式选型
直接查数据库里 password 字段值的长度,比任何文档都管用:
– 如果是 32 位(如 5f4dcc3b5aa765d61d8327deb882cf99),基本就是裸 md5($pass);
– 如果是 60 位左右、开头带 $2y$ 或 $2a$,说明用了 password_hash();
– 混合加盐(比如 md5(md5($pass).$salt))也会是 32 位,但盐值通常硬编码在控制器或函数里,得翻代码确认。
登录验证时不能复用注册时的哈希逻辑
常见错误是:注册用 password_hash($pwd) 存库,登录却写成 md5($pwd) === $db_pass,结果永远验不过。
必须严格对齐:
- 注册/重置用
password_hash($pwd, PASSWORD_DEFAULT)→ 登录必须用password_verify($input_pwd, $db_pass) - 注册/重置用
md5($pwd)→ 登录就用md5($input_pwd) === $db_pass - 加盐 MD5(如
md5(md5($pwd).$salt))→ 登录必须原样复现该表达式,不能漏掉内层md5或盐值
Session 校验和权限跳转要分离处理
登录成功后保存 session 和后续跳转,别混在同一个条件分支里写死:
– 先确保 session('user', $user) 已写入(且不含敏感字段如 psd);
– 再根据 $user['quanxian'] 或角色字段做跳转,但注意:权限字段必须来自数据库查询结果,不能靠前端传参(如 input('post.quanxian'))伪造;
– 如果权限逻辑复杂(比如多角色叠加),建议封装成独立方法 getRedirectUrlByRole($user),避免 if-elseif-else 堆砌。
验证码失败会导致 session 初始化异常
ThinkPHP5 的 Verify 类依赖 session 正常工作。如果验证码总提示“错误”,大概率不是逻辑问题,而是 session 底层失效:
– 检查 php.ini 中 session.save_path 是否指向可写的目录(如 /tmp 或 c:/temp),并确认 IIS/Apache 有读写权限;
– 不要手动调用 session_start(),TP5 会自动管理;
– 验证码校验前,确保没提前调用过 session_destroy() 或清空过 session;
– 浏览器禁用 cookie 或跨域请求时,Verify 也会静默失败——这时应改用极验等无状态方案。
password_hash(),也得在登录逻辑里做双轨兼容(先试新算法,失败再 fallback 到旧 md5)。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











