php怎么实现登录功能
数据库设计
创建一个用户表存储登录信息,通常包含用户名、密码(加密)等字段。MySQL示例:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
密码加密
使用PHP的password_hash()函数进行密码加密,存储到数据库前处理:
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
登录表单
HTML表单提交用户名和密码:
<form action="login.php" method="post">
<input type="text" name="username" placeholder="用户名" required>
<input type="password" name="password" placeholder="密码" required>
<button type="submit">登录</button>
</form>
验证处理
在login.php中验证用户凭证:
session_start();
$pdo = new PDO('mysql:host=localhost;dbname=test', 'username', 'password');
$stmt = $pdo->prepare("SELECT * FROM users WHERE username = ?");
$stmt->execute([$_POST['username']]);
$user = $stmt->fetch();
if ($user && password_verify($_POST['password'], $user['password'])) {
$_SESSION['user_id'] = $user['id'];
header("Location: dashboard.php");
} else {
echo "用户名或密码错误";
}
会话管理
登录成功后使用$_SESSION保存用户状态:
session_start();
if (!isset($_SESSION['user_id'])) {
header("Location: login.php");
exit();
}
安全增强
加入CSRF防护和登录尝试限制:
// 生成CSRF令牌
if (empty($_SESSION['csrf_token'])) {
$_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验证失败");
}
密码重置
实现密码重置功能需包含邮箱验证:

// 生成重置令牌
$token = bin2hex(random_bytes(50));
$stmt = $pdo->prepare("UPDATE users SET reset_token=?, reset_expires=DATE_ADD(NOW(), INTERVAL 1 HOUR) WHERE email=?");
$stmt->execute([$token, $_POST['email']]);
// 发送含重置链接的邮件
$resetLink = "https://example.com/reset.php?token=$token";
mail($_POST['email'], "密码重置", "请访问: $resetLink");






