用户登录校验需在应用层用bcrypt等强哈希算法加密密码并恒定时间比对,MySQL仅作安全存储后端;账号字段应唯一且避免枚举,查询须参数化防注入,禁用数据库内密码比对。
用户登录校验的核心是安全、准确地比对用户输入的账号密码与数据库中存储的信息。MySQL 本身不直接参与应用层的登录逻辑,而是作为凭证存储后端——关键在于如何设计存储结构、加密方式和查询验证流程。
MySQL 表中绝不能以明文保存用户密码。推荐使用强哈希算法(如 bcrypt 或 Argon2)在应用层完成加密,再存入数据库。MySQL 内置的 SHA2() 或 MD5() 不适合密码存储,因缺乏盐值(salt)且计算过快,易被暴力破解。
password_hash 字段建议使用独立的 username 或 email 作为登录标识字段,并设为 UNIQUE 约束。避免用自增 id 作登录凭证,防止枚举风险。若支持多方式登录(如手机号/邮箱),可统一归入一个 login_id 字段,并加索引提升查询效率。
CREATE TABLE users (id INT PRIMARY KEY AUTO_INCREMENT, login_id VARCHAR(255) UNIQUE NOT NULL, password_hash VARCHAR(255) NOT NULL, ...);
login_id 精确查找一条记录,避免模糊匹配或 OR 条件拼接(防 SQL 注入)不要依赖 MySQL 的 WHERE password = SHA2(?, 256) 这类写法——这等于把密码哈希逻辑交给数据库,既难控制盐值,又绕过应用层的安全策略(如失败次数限制、IP 封禁)。正确做法是:
login_id 查出用户记录(含 password_hash 和状态字段如 is_act
ive)仅靠密码验证远远不够。生产环境应叠加基础防护: