PHP弱口令与明文密码漏洞的核心在于必须弃用明文存储和弱哈希(如md5、sha1),强制使用password_hash()自动加盐加密,并后端校验密码强度、对接泄露库、实施二次验证及配置加固。

PHP中弱口令和明文密码漏洞,核心问题不在“怎么改代码”,而在于**彻底放弃明文存储、强制提升密码强度、并用现代密码学机制替代旧习惯**。只要还在数据库里存原始密码或简单哈希(如md5、sha1),就等于给攻击者递钥匙。
停用明文与弱哈希,必须用 password_hash()
明文密码绝对禁止;md5、sha1、crypt()等手动哈希方式已过时且不安全。PHP自5.5起内置的 password_hash() 是唯一推荐方案,它自动加盐、适配算法演进(当前默认是 Argon2 或 bcrypt):
- 注册/改密时:直接调用
$hash = password_hash($password, PASSWORD_DEFAULT);存入数据库 - 登录验证时:用
password_verify($input, $stored_hash)比对,不需解密 - 不要自己拼接 salt,不要固定算法字符串,
PASSWORD_DEFAULT会随PHP升级自动切换更安全算法
强制密码复杂度与长度限制
前端校验可被绕过,必须在后端严格把关:
- 最低长度设为8位以上,建议12位;拒绝纯数字、常见字典词(如 "123456"、"password")
- 用正则检查是否含大小写字母+数字+特殊字符中的至少三类:
/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[^\da-zA-Z]).{12,}$/ - 注册接口返回明确错误(如“密码需包含大写字母和符号”),但不要暴露具体哪条规则未满足(防枚举)
禁用弱口令策略与二次验证兜底
仅靠密码强度不够,需叠加防护层:
- 接入公开的泄露密码库比对(如 Have I Been Pwned API),若用户密码已出现在历史泄露库中,直接拒绝注册
- 登录失败5次后启用图形验证码或临时锁定账号(注意防暴力遍历,避免暴露真实用户名存在性)
- 高敏感操作(如修改密码、转账)必须二次验证:短信、邮箱或 TOTP(Google Authenticator 类)
清理历史隐患与配置加固
很多弱口令问题源于环境放任:
- 检查数据库:把所有
password字段类型改为VARCHAR(255)(password_hash输出长度可能超60) -
php.ini 中关闭危险配置:
expose_php = Off、display_errors = Off,防止错误信息泄露密码字段结构 - 管理员后台密码不得复用普通用户密码逻辑,应单独强策略+独立审计日志
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











