php登陆功能实现
用户认证基础实现
使用PHP内置的password_hash()和password_verify()函数进行安全密码处理。注册时对密码进行哈希存储:
$hashed_password = password_hash($plain_password, PASSWORD_DEFAULT);
登录时验证密码:
if (password_verify($input_password, $stored_hash)) {
// 认证成功
}
会话管理机制
通过session_start()初始化会话,认证成功后设置会话变量:
$_SESSION['user_id'] = $user_id;
$_SESSION['logged_in'] = true;
每个受保护页面开头检查会话状态:
session_start();
if (!isset($_SESSION['logged_in'])) {
header('Location: login.php');
exit;
}
数据库交互示例
假设有users表包含id, username, password字段:

// 查询用户
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
// 验证成功后设置会话
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
}
安全增强措施
实现CSRF保护生成令牌:
$_SESSION['csrf_token'] = bin2hex(random_bytes(32));
表单中包含隐藏字段:
<input type="hidden" name="csrf_token" value="<?php echo $_SESSION['csrf_token']; ?>">
验证时比对:

if ($_POST['csrf_token'] !== $_SESSION['csrf_token']) {
die('CSRF验证失败');
}
完整登录流程示例
login.php处理脚本:
session_start();
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = filter_input(INPUT_POST, 'username', FILTER_SANITIZE_STRING);
$password = $_POST['password'];
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$username]);
$user = $stmt->fetch();
if ($user && password_verify($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['logged_in'] = true;
header('Location: dashboard.php');
exit;
} else {
$error = "无效的凭据";
}
}
密码重置功能
实现密码重置请求:
// 生成重置令牌
$token = bin2hex(random_bytes(50));
$expires = date('Y-m-d H:i:s', strtotime('+1 hour'));
$stmt = $pdo->prepare("UPDATE users SET reset_token=?, reset_expires=? WHERE email=?");
$stmt->execute([$token, $expires, $email]);
发送包含令牌链接的邮件,验证时检查有效期:
$stmt = $pdo->prepare("SELECT * FROM users WHERE reset_token=? AND reset_expires > NOW()");
$stmt->execute([$token]);






