PHP从零开始构建安全登录系统:详细指南**
用户登录系统是现代Web应用程序中最常见也最重要的功能之一,它允许用户安全地访问其个人信息,并管理其在平台上的活动,PHP作为一种广泛使用的服务器端脚本语言,非常适合构建登录系统,本文将详细介绍如何使用PHP从零开始构建一个基本但安全的登录系统,涵盖前端表单、后端验证、数据库交互以及基本的安全措施。
系统概述与准备工作
一个基本的登录系统通常包含以下部分:
- 用户注册页面 (register.php):允许新用户创建账户。
- 用户登录页面 (login.php):允许已注册用户登录。
- 处理登录逻辑的脚本 (authenticate.php):验证用户提交的登录信息。
- 受保护的页面 (dashboard.php 或 profile.php):只有登录用户才能访问。
- 登出功能 (logout.php):用户安全退出。
- 数据库表 (users):存储用户信息(如用户名、密码哈希等)。
准备工作:
- Web服务器环境:安装如XAMPP、WAMP或MAMP等集成环境,包含PHP和MySQL。
- 数据库:创建一个MySQL数据库。
- 基础PHP知识:了解变量、数组、函数、表单处理、数据库连接等。
数据库设计
我们需要一个数据库表来存储用户信息,我们可以创建一个名为users
的表,包含以下字段:
CREATE TABLE `users` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `username` VARCHAR(50) NOT NULL UNIQUE, `password` VARCHAR(255) NOT NULL, -- 存储哈希后的密码 `email` VARCHAR(100) NOT NULL UNIQUE, `created_at` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
重要提示:绝对不要在数据库中存储明文密码!我们将使用PHP的password_hash()
和password_verify()
函数来处理密码的哈希和验证。
用户注册页面 (register.php)
这个页面包含一个注册表单,用于收集用户名、密码和电子邮件。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">用户注册</title> <style> body { font-family: Arial, sans-serif; line-height: 1.6; margin: 0; padding: 20px; } .container { max-width: 600px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px; } input[type="text"], input[type="password"], input[type="email"] { width: 100%; padding: 8px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 4px; } input[type="submit"] { background-color: #5cb85c; color: white; padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; } .error { color: red; margin-bottom: 10px; } </style> </head> <body> <div class="container"> <h2>用户注册</h2> <?php // 可以在这里显示注册成功或错误信息 if (isset($_GET['success']) && $_GET['success'] == '1') { echo "<p style='color: green;'>注册成功!请<a href='login.php'>登录</a>。</p>"; } if (isset($_GET['error'])) { echo "<p class='error'>错误:" . htmlspecialchars($_GET['error']) . "</p>"; } ?> <form action="register_process.php" method="post"> <label for="username">用户名:</label> <input type="text" id="username" name="username" required> <label for="email">电子邮箱:</label> <input type="email" id="email" name="email" required> <label for="password">密码:</label> <input type="password" id="password" name="password" required minlength="6"> <label for="confirm_password">确认密码:</label> <input type="password" id="confirm_password" name="confirm_password" required minlength="6"> <input type="submit" value="注册"> </form> </div> </body> </html>
处理注册逻辑 (register_process.php)
这个脚本接收注册表单提交的数据,进行验证,并将用户信息(密码哈希后)存入数据库。
<?php // 启动会话(用于后续登录状态管理) session_start(); // 数据库连接信息 $db_host = 'localhost'; $db_user = 'root'; // 你的数据库用户名 $db_pass = ''; // 你的数据库密码 $db_name = 'your_database_name'; // 你的数据库名 $conn = new mysqli($db_host, $db_user, $db_pass, $db_name); if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } // 检查表单是否提交 if ($_SERVER["REQUEST_METHOD"] == "POST") { $username = trim($_POST['username']); $email = trim($_POST['email']); $password = trim($_POST['password']); $confirm_password = trim($_POST['confirm_password']); // 验证 $errors = []; if (empty($username) || empty($email) || empty($password) || empty($confirm_password)) { $errors[] = "所有字段都必须填写。"; } if (!filter_var($email, FILTER_VALIDATE_EMAIL)) { $errors[] = "电子邮箱格式无效。"; } if (strlen($password) < 6) { $errors[] = "密码长度至少为6个字符。"; } if ($password !== $confirm_password) { $errors[] = "两次输入的密码不匹配。"; } // 检查用户名和邮箱是否已存在 $stmt = $conn->prepare("SELECT id FROM users WHERE username = ? OR email = ?"); $stmt->bind_param("ss", $username, $email); $stmt->execute(); $result = $stmt->get_result(); if ($result->num_rows > 0) { $errors[] = "用户名或电子邮箱已被注册。"; } $stmt->close(); if (empty($errors)) { // 密码哈希 $hashed_password = password_hash($password, PASSWORD_DEFAULT); // 插入用户数据 $stmt = $conn->prepare("INSERT INTO users (username, email, password) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $username, $email, $hashed_password); if ($stmt->execute()) { // 注册成功,重定向到登录页面并显示成功消息 header("Location: register.php?success=1"); exit(); } else { echo "错误: " . $stmt->error; } $stmt->close(); } else { // 有错误,重定向回注册页面并显示错误 $error_string = implode(" ", $errors); header("Location: register.php?error=" . urlencode($error_string)); exit(); } } $conn->close(); ?>
用户登录页面 (login.php)
这个页面包含一个登录表单,用于收集用户名和密码。
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8">用户登录</title> <style> body { font-family: Arial, sans-serif; line-height: 1.6; margin: 0; padding: 20px; } .container { max-width: 400px; margin: 0 auto; padding: 20px; border: 1px solid #ddd; border-radius: 5px; } input[type="text"], input[type="password"] { width: 100%; padding: 8px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 4px; } input[type="submit"] { background-color: #007bff; color: white; padding: 10px 15px; border: none; border-radius: 4px; cursor: pointer; width: 100%; } .error { color: red; margin-bottom: 10px; } </style> </head> <body> <div class="container"> <h2>用户登录</h2> <?php if (isset($_GET['error'])) { echo "<p class='error'>错误:" . htmlspecialchars($_GET['error']) . "</p>"; } ?> <form action="authenticate.php" method="post"> <label for="username">
还没有评论,来说两句吧...