登录验证必须用session且后端校验,禁用前端JS判断;密码须password_hash加密、password_verify校验;需限流防爆破、统一错误提示;退出要清session和cookie;HTTPS为强制前提。
用户提交账号密码后,PHP 后端必须验证凭证有效性,并通过 session_start() 和 $_SESSION 保存登录态。仅靠 JavaScript 检查或隐藏按钮毫无安全意义——请求仍可被绕过直接调用后台接口。

is_logged_in 放在 JS 里判断,或只校验用户名不查密码哈希;结果未登录用户也能伪造请求访问后台页面。
isset($_SESSION['user_id']) 且值为合法整数password_verify() 校验密码,存储密码必须是 password_hash() 生成的哈希,绝不能存明文或简单 md5header('Content-Type: application/json'),避免 XSS 风险直接返回“密码错误”或“用户不存在”,等于帮攻击者枚举有效用户名。更稳妥的做法是统一提示“账号或密码错误”,同时记录失败次数并临时锁定 IP 或账号。
实操建议:
login_fail:192.168.1.100,每失败一次 INCR,超 5 次后 EXPIRE 15 分钟http_status = 401 或 error_code = 1002 这类可被自动化识别的标识——统一用 200 + {“success”: false, “message”: “登录失败”}imagepng() + $_SESSION['captcha_code'] 自建轻量方案,无需第三方 SDK只执行 session_destroy() 不够——它只删服务器端 session 文件,浏览器里的 PHPSESSID cookie 依然存在,下次请求可能复用旧会话。
正确退出流程:
$_SESSION = [] 清空数据session_destroy()
setcookie('PHPSESSID', '', time() - 3600, '/')
session_name('MYSESS')),退出时也要对应删 setcookie('MYSESS', ...)
否则可能出现:用户点退出后,新开无痕窗口仍能访问需登录的页面。
即使你用 password_hash()、加了验证码、限制了失败次数,只要网站走 HTTP,登录过程中的密码就以明文暴露在链路上。中间人可直接截获 POST 数据包。
必须确认以下三点已落实:
return 301 https://$host$request_uri)session.cookie_secure = 1 和 session.cookie_httponly = 1(写在 php.ini 或用 ini_set())很多开发者卡在“本地测试用 localhost 没证书”,结果上线才暴雷——开发阶段就该用 https://127.0.0.1 + 自签证书跑通全流程。