PHP中的授权与身份验证:完整指南及示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

PHP中的授权与身份验证:从基础到安全防护

Web应用程序的安全性始于正确实现身份验证(验证用户身份)和授权(检查用户访问权限)。在PHP中,这些机制既可以通过内置函数实现,也可以使用专门的库。本文将解析关键概念,编写代码示例,并探讨最佳安全实践。



1. 基本概念:身份验证 vs 授权

在编写代码之前,明确区分这两个术语非常重要:

  • 身份验证 — 验证用户是否为其所声称的身份的过程(通常通过登录名和密码)。
  • 授权 — 确定经过身份验证的用户可以访问哪些资源或执行哪些操作的过程(例如,“admin”或“user”角色)。

这两个阶段中任何一个实现错误都可能导致数据泄露或未经授权的访问。



2. 通过会话实现基本身份验证(原生PHP)

最常见的方法是使用会话。PHP提供了内置的 $_SESSION 机制。我们来看一个简单的例子。



步骤1:登录表单 (login.php)

<?phpsession_start();?><!DOCTYPE html><html><head>    <title>登录网站</title></head><body>    <form method="POST" action="login.php">        <label>用户名:</label>        <input type="text" name="username" required>        <label>密码:</label>        <input type="password" name="password" required>        <button type="submit" name="login">登录</button>    </form></body></html>


步骤2:处理登录(同 login.php)

<?phpsession_start();require_once 'db.php'; // 连接数据库

if (isset($_POST['login'])) { $username = trim($_POST['username']); $password = $_POST['password'];

// 1. 使用预处理语句防止SQL注入 $stmt = $pdo->prepare("SELECT id, password_hash FROM users WHERE username = ?"); $stmt->execute([$username]); $user = $stmt->fetch();

// 2. 通过 password_verify 验证密码 if ($user && password_verify($password, $user['password_hash'])) { // 身份验证成功 $_SESSION['user_id'] = $user['id']; $_SESSION['logged_in'] = true; header("Location: dashboard.php"); exit; } else { $error = "用户名或密码错误"; }}?>


步骤3:在受保护页面上检查授权

<?phpsession_start();if (!isset($_SESSION['logged_in']) || $_SESSION['logged_in'] !== true) {    header("Location: login.php");    exit;}// 允许访问echo "欢迎,用户 #" . htmlspecialchars($_SESSION['user_id']);?>


3. 密码哈希:切勿以明文形式存储密码

PHP提供了处理密码的安全函数:

  • password_hash($password, PASSWORD_BCRYPT) — 自动生成带盐的哈希。
  • password_verify($password, $hash) — 验证密码是否与哈希匹配。

用户注册示例:

<?php$password = "user123";$hash = password_hash($password, PASSWORD_BCRYPT);// 将 $hash 保存到数据库$stmt = $pdo->prepare("INSERT INTO users (username, password_hash) VALUES (?, ?)");$stmt->execute([$username, $hash]);?>

重要提示:切勿对密码使用 md5() 或 sha1() — 它们已过时且容易被破解。



4. 基于角色的授权(Role-Based Access Control)

为了区分权限

推荐