php登陆注册功能实现
数据库设计
创建用户表存储用户信息,通常包括用户名、密码(加密)、邮箱等字段。示例SQL:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
注册功能实现
处理用户提交的表单数据,验证后存入数据库。使用password_hash()进行密码加密:

// 处理POST请求
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = trim($_POST['username']);
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$email = filter_var($_POST['email'], FILTER_SANITIZE_EMAIL);
// 插入数据库
$stmt = $pdo->prepare("INSERT INTO users (username, password, email) VALUES (?, ?, ?)");
$stmt->execute([$username, $password, $email]);
}
登录功能实现
验证用户凭证并创建会话:
session_start();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$username = $_POST['username'];
$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'];
header("Location: dashboard.php");
}
}
表单安全防护
添加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 (!hash_equals($_SESSION['csrf_token'], $_POST['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, $email]);
// 发送邮件(伪代码)
$resetLink = "https://example.com/reset.php?token=$token";
mail($email, "密码重置", "点击链接重置密码: $resetLink");
会话管理
实现自动登出和会话保护:
// 设置会话参数
ini_set('session.cookie_httponly', 1);
ini_set('session.cookie_secure', 1); // HTTPS下启用
session_regenerate_id(true);
// 检查会话有效期
if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
session_unset();
session_destroy();
}
$_SESSION['LAST_ACTIVITY'] = time();
注意实际部署时需要结合HTTPS、输入过滤、防暴力破解等安全措施。以上代码需根据具体框架和项目结构调整实现。






