<?php
session_start();
// 错误报告设置(开发环境)
error_reporting(E_ALL);
ini_set('display_errors', 1);
// 数据库配置
define('DB_HOST', 'localhost');
define('DB_USER', 'your_db_username');
define('DB_PASS', 'your_db_password');
define('DB_NAME', 'your_db_name');
// 处理登录表单提交
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 获取并清理用户输入
$username = trim($_POST['username'] ?? '');
$password = trim($_POST['password'] ?? '');
// 验证输入
if (empty($username) || empty($password)) {
$error = "用户名和密码不能为空!";
} else {
try {
// 创建数据库连接
$pdo = new PDO(
"mysql:host=" . DB_HOST . ";dbname=" . DB_NAME . ";charset=utf8",
DB_USER,
DB_PASS,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false
]
);
// 准备SQL查询(使用命名参数)
$stmt = $pdo->prepare("SELECT id, username, password FROM users WHERE username = :username LIMIT 1");
$stmt->bindParam(':username', $username);
$stmt->execute();
// 检查用户是否存在
if ($stmt->rowCount() === 1) {
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// 验证密码(假设密码使用password_hash存储)
if (password_verify($password, $user['password'])) {
// 登录成功:设置会话变量
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
// 重定向到受保护页面
header('Location: dashboard.php');
exit;
} else {
$error = "用户名或密码无效!";
}
} else {
$error = "用户名或密码无效!";
}
} catch (PDOException $e) {
// 记录错误到日志(生产环境)
error_log("数据库错误: " . $e->getMessage());
$error = "系统错误,请稍后再试";
}
}
}
?>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">用户登录</title>
<style>
body { font-family: Arial, sans-serif; }
.container { max-width: 400px; margin: 50px auto; padding: 20px; border: 1px solid #ccc; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; }
input[type="text"], input[type="password"] { width: 100%; padding: 8px; }
.error { color: red; margin-bottom: 15px; }
</style>
</head>
<body>
<div class="container">
<h2>用户登录</h2>
<?php if (isset($error)): ?>
<div class="error"><?php echo htmlspecialchars($error); ?></div>
<?php endif; ?>
<form method="POST">
<div class="form-group">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
</div>
<button type="submit">登录</button>
</form>
</div>
</body>
</html>
关键安全措施说明:
-
预处理语句:

- 使用PDO预处理语句防止SQL注入
bindParam确保安全参数绑定
-
密码安全:
- 使用
password_hash()存储密码(注册时) - 使用
password_verify()验证密码(登录时)
- 使用
-
输入处理:
- 使用
trim()清理输入 - 验证非空字段
- 输出时使用
htmlspecialchars()防止XSS
- 使用
-
错误处理:
- 生产环境隐藏详细错误(当前开发模式显示错误)
- 使用
error_log()记录服务器错误
-
会话管理:

- 登录成功后设置会话变量
- 使用
session_start()开启会话
-
数据库安全:
- 使用UTF8字符集
- 禁用模拟预处理(
PDO::ATTR_EMULATE_PREPARES => false)
使用说明:
-
创建数据库表(执行以下SQL):
CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(255) NOT NULL );
-
注册用户(示例注册代码片段):
// 注册时密码处理 $hashedPassword = password_hash($_POST['password'], PASSWORD_DEFAULT);
// 存储到数据库(同样使用预处理语句)
$stmt = $pdo->prepare(“INSERT INTO users (username, password) VALUES (?, ?)”);
$stmt->execute([$username, $hashedPassword]);

3. **受保护页面示例**(dashboard.php):
```php
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login.php');
exit;
}
?>
<!DOCTYPE html>
<html>
<body>
<h1>欢迎, <?= htmlspecialchars($_SESSION['username']) ?>!</h1>
<a href="logout.php">退出</a>
</body>
</html>
- 退出登录(logout.php):
<?php session_start(); session_destroy(); header('Location: login.php'); exit; ?>
最佳实践建议:
- 生产环境中设置
display_errors = Off - 使用HTTPS传输登录数据
- 添加登录失败次数限制
- 定期更新密码哈希算法
- 使用CSRF令牌防止跨站请求伪造
这个实现包含了现代PHP登录系统所需的核心安全功能,可根据实际需求扩展更多功能(如记住我、密码重置等)。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/288514.html

