0

0

PHP用户数据权限管理:实现用户仅能编辑和删除自己的信息

DDD

DDD

发布时间:2025-11-14 11:44:31

|

551人浏览过

|

来源于php中文网

原创

PHP用户数据权限管理:实现用户仅能编辑和删除自己的信息

本教程旨在指导开发者如何为php网站实现用户数据权限管理,确保每个登录用户只能编辑和删除自己的个人信息,而无法操作其他用户的数据。文章将详细阐述如何通过会话管理、客户端ui控制和服务器端严格验证相结合的多层安全策略,有效防止未经授权的数据修改和删除,提升应用的安全性和数据完整性。

在构建用户交互式网站时,一个核心的安全要求是确保用户只能访问和修改他们被授权的数据。对于个人资料管理功能,这意味着每个登录用户都应该只能编辑和删除自己的信息,而不能对其他用户的记录进行操作。本教程将基于提供的代码示例,详细讲解如何通过客户端界面控制和服务器端验证相结合的方式,实现这一关键的安全机制。

1. 理解会话管理与用户身份识别

实现用户数据隔离的基础是正确识别当前登录的用户。在PHP中,这通常通过会话(Session)机制来完成。当用户成功登录后,其唯一标识符(如用户ID)应存储在会话变量中。

在 plogin.php 文件中,用户成功验证后,以下代码片段会将用户的ID存储在 $_SESSION['id'] 中:

// ... (plogin.php 现有代码) ...
if(password_verify($password, $hashed_password)){
    session_start(); // 确保会话已启动
    $_SESSION["loggedin"] = true;
    $_SESSION["id"] = $id; // 将用户ID存储到会话中
    $_SESSION["username"] = $username;                            
    header("location: allcontacts.php");
} else {
    // ...
}
// ...

确保 session_start(); 在所有输出之前被调用,并且在用户登录成功时,$_SESSION['id'] 被正确赋值。

立即学习PHP免费学习笔记(深入)”;

2. 客户端界面控制:根据用户权限显示操作链接

在展示用户列表(例如 allcontacts.php 页面)时,我们可以根据当前登录用户的ID,有条件地显示“编辑”和“删除”链接。这意味着如果某一行数据属于当前登录用户,则显示这些操作链接;否则,不显示。

首先,在 allcontacts.php 文件的顶部,需要启动会话并获取当前登录用户的ID:

<?php
// 确保在任何HTML输出之前启动会话
session_start();

// 检查用户是否已登录
if(isset($_SESSION["loggedin"]) && $_SESSION["loggedin"] === true) {
    $current_user_id = $_SESSION['id']; // 获取当前登录用户的ID
} else {
    // 用户未登录,可以重定向到登录页或设置一个空ID
    $current_user_id = null; 
    // header("location: plogin.php"); 
    // exit;
}

include "pconfig.php"; // 数据库连接文件
?>

然后,修改 allcontacts.php 中表格渲染部分的代码,在生成“编辑”和“删除”列时加入条件判断:

白月工作室车辆与车辆保险管理系统GBK1.0
白月工作室车辆与车辆保险管理系统GBK1.0

本系统是为四川九寨运业所定制的车辆保险管理与报表管理系统。其主要的功能是对车辆的管理与保险的管理:车辆管理:1、车辆的增加编辑与修改,以及承包和驾驶员信息2、车辆的报废(删除)保险管理:1、针对车辆的保险增加2、针对车辆的保险编辑和修改3、保险报表用户管理:1、简单的用户管理,单级权限用户名:admin密码:123456

下载
<!-- ... (allcontacts.php 现有代码) ... -->
<?php
while($data = mysqli_fetch_array($records))
{
?>
  <tr>
    <td><?php echo $data['id']; ?></td>
    <td><?php echo htmlspecialchars($data['username']); ?></td>
    <td><?php echo htmlspecialchars($data['password']); ?></td> 
    <?php if($current_user_id && $current_user_id == $data['id']) { ?>
        <td><a href="edit.php?id=<?php echo $data['id']; ?>">Edit</a></td>
        <td><a href="delete.php?id=<?php echo $data['id']; ?>">Delete</a></td>
    <?php } else { ?>
        <td></td> <!-- 不属于当前用户的行,不显示编辑链接 -->
        <td></td> <!-- 不属于当前用户的行,不显示删除链接 -->
    <?php } ?>
  </tr> 
<?php
}
?>
<!-- ... -->

注意事项:

  • htmlspecialchars() 用于防止XSS攻击,虽然原始代码中未包含,但在输出用户数据时强烈建议使用。
  • 客户端的UI控制仅提供用户体验上的便利,不能作为安全防线。恶意用户仍然可以通过直接构造URL来尝试访问 edit.php 或 delete.php。因此,服务器端验证至关重要。

3. 服务器端严格验证:防止未经授权的操作

为了确保安全性,edit.php 和 delete.php 这类处理敏感操作的脚本必须在执行任何数据库操作之前,严格验证请求是否来自授权用户。这意味着需要比较当前登录用户的ID与请求操作的数据记录的ID。

3.1 增强 delete.php 的安全性

原始的 delete.php 存在安全漏洞,其验证逻辑 (if($param_username == "$id")) 是不正确的,并且没有使用预处理语句。我们需要对其进行彻底改造:

<?php
// 确保在任何HTML输出之前启动会话
session_start(); 

include "pconfig.php"; // 数据库连接文件

// 1. 检查用户是否已登录且会话ID存在
if (!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true || !isset($_SESSION["id"])) {
    // 用户未登录或会话ID丢失,重定向到登录页
    header("location: plogin.php");
    exit;
}

$current_user_id = $_SESSION['id']; // 获取当前登录用户的ID
$record_id_to_delete = $_GET['id'] ?? null; // 使用null合并运算符安全获取GET参数

// 2. 验证要删除的记录ID是否有效
if (empty($record_id_to_delete) || !is_numeric($record_id_to_delete)) {
    echo "错误:无效的记录ID。";
    exit;
}

// 3. 核心安全验证:确保当前用户正在尝试删除自己的记录
if ($current_user_id == $record_id_to_delete) {
    // 使用预处理语句删除记录,防止SQL注入
    $sql = "DELETE FROM users WHERE id = ?";

    if ($stmt = mysqli_prepare($link, $sql)) {
        mysqli_stmt_bind_param($stmt, "i", $record_id_to_delete); // "i" 表示整数类型

        if (mysqli_stmt_execute($stmt)) {
            // 删除成功
            mysqli_stmt_close($stmt);
            mysqli_close($link);
            header("location: allcontacts.php"); // 重定向回联系人列表页
            exit;
        } else {
            echo "操作失败!请稍后再试。";
        }
        mysqli_stmt_close($stmt);
    } else {
        echo "数据库语句准备失败:" . mysqli_error($link);
    }
} else {
    // 4. 未经授权的删除尝试
    echo "错误:您无权删除此记录。";
}

// 确保在所有可能的执行路径中关闭数据库连接
mysqli_close($link);
?>

3.2 edit.php 的验证逻辑(示例)

尽管 edit.php 的具体代码未提供,但其服务器端验证逻辑应与 delete.php 类似。在处理表单提交或加载编辑数据时,必须执行以下步骤:

  1. 启动会话并验证登录状态。
  2. 获取当前登录用户的ID ($_SESSION['id'])。
  3. 获取要编辑的记录ID(通常来自GET参数或POST数据)。
  4. 比较 $_SESSION['id'] 与要编辑记录的ID。
  5. 如果ID匹配,则允许执行编辑操作(查询并显示数据,或更新数据库)。
  6. 如果ID不匹配,则拒绝操作并显示错误消息或重定向。

示例 edit.php 骨架:

<?php
session_start();
include "pconfig.php";

if (!isset($_SESSION["loggedin"]) || $_SESSION["loggedin"] !== true || !isset($_SESSION["id"])) {
    header("location: plogin.php");
    exit;
}

$current_user_id = $_SESSION['id'];
$record_id_to_edit = $_GET['id'] ?? null; // 获取要编辑的记录ID

if (empty($record_id_to_edit) || !is_numeric($record_id_to_edit)) {
    echo "错误:无效的记录ID。";
    exit;
}

// 确保当前用户有权编辑此记录
if ($current_user_id == $record_id_to_edit) {
    // --- 在这里编写获取并显示待编辑数据或处理表单提交的代码 ---

    // 示例:获取数据
    $sql = "SELECT username, password FROM users WHERE id = ?";
    if ($stmt = mysqli_prepare($link, $sql)) {
        mysqli_stmt_bind_param($stmt, "i", $record_id_to_edit);
        if (mysqli_stmt_execute($stmt)) {
            $result = mysqli_stmt_get_result($stmt);
            if (mysqli_num_rows($result) == 1) {
                $user_data = mysqli_fetch_array($result, MYSQLI_ASSOC);
                // 现在 $user_data 包含了要编辑的用户信息,可以填充到表单中
                // ... 显示编辑表单 ...
            } else {
                echo "错误:未找到指定记录。";
            }
        } else {
            echo "Oops! Something went wrong. Please try again later.";
        }
        mysqli_stmt_close($stmt);
    }

    // 示例:处理表单提交更新数据 (如果表单是POST请求)
    if ($_SERVER["REQUEST_METHOD"] == "POST") {
        // ... 获取POST数据,验证,然后使用预处理语句更新数据库 ...
        // UPDATE users SET username = ?, password = ? WHERE id = ?
        // 确保 WHERE id = ? 的条件是 $current_user_id
    }

} else {
    echo "错误:您无权编辑此记录。";
}

mysqli_close($link);
?>

4. 数据库设计建议

在数据库设计层面,建议使用更具描述性的列名,而不是通用的 id。例如,在 users 表中,可以将主键命名为 user_id。当涉及到多个表关联时,例如 orders 表中引用 users 表,可以使用 user_id 作为外键,这样可以避免歧义,提高代码的可读性和可维护性。

5. 总结与安全最佳实践

实现用户数据隔离是一个多层面的任务,涉及:

  • 会话管理: 准确识别当前登录用户。
  • 客户端UI控制: 提供友好的用户体验,隐藏非授权操作链接。
  • 服务器端严格验证: 这是最关键的安全层,必须在执行任何敏感数据库操作前,验证用户权限。
  • 使用预处理语句: 始终使用预处理语句(如 mysqli_prepare 和 mysqli_stmt_bind_param)来执行数据库查询,以防止SQL注入攻击。
  • 密码哈希: 存储密码时使用强哈希算法(如 password_hash()),绝不存储明文密码。
  • 错误处理: 提供清晰但非详细的错误信息给用户,将详细的错误日志记录在服务器端。

通过结合这些策略,您可以构建一个既安全又用户友好的Web应用程序,确保用户数据的完整性和保密性。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

1133

2023.10.12

SQL中distinct的用法
SQL中distinct的用法

SQL中distinct的语法是“SELECT DISTINCT column1, column2,...,FROM table_name;”。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

340

2023.10.27

SQL中months_between使用方法
SQL中months_between使用方法

在SQL中,MONTHS_BETWEEN 是一个常见的函数,用于计算两个日期之间的月份差。想了解更多SQL的相关内容,可以阅读本专题下面的文章。

381

2024.02.23

SQL出现5120错误解决方法
SQL出现5120错误解决方法

SQL Server错误5120是由于没有足够的权限来访问或操作指定的数据库或文件引起的。想了解更多sql错误的相关内容,可以阅读本专题下面的文章。

2152

2024.03.06

sql procedure语法错误解决方法
sql procedure语法错误解决方法

sql procedure语法错误解决办法:1、仔细检查错误消息;2、检查语法规则;3、检查括号和引号;4、检查变量和参数;5、检查关键字和函数;6、逐步调试;7、参考文档和示例。想了解更多语法错误的相关内容,可以阅读本专题下面的文章。

380

2024.03.06

oracle数据库运行sql方法
oracle数据库运行sql方法

运行sql步骤包括:打开sql plus工具并连接到数据库。在提示符下输入sql语句。按enter键运行该语句。查看结果,错误消息或退出sql plus。想了解更多oracle数据库的相关内容,可以阅读本专题下面的文章。

1663

2024.04.07

sql中where的含义
sql中where的含义

sql中where子句用于从表中过滤数据,它基于指定条件选择特定的行。想了解更多where的相关内容,可以阅读本专题下面的文章。

585

2024.04.29

sql中删除表的语句是什么
sql中删除表的语句是什么

sql中用于删除表的语句是drop table。语法为drop table table_name;该语句将永久删除指定表的表和数据。想了解更多sql的相关内容,可以阅读本专题下面的文章。

440

2024.04.29

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

3

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 847人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号