点击表格按钮时将数据库ID存入SESSION的实现方案
实现PHP用户ID的Session存储改造(规避GET/POST暴露风险)
需求背景
现有一段PHP用户信息更新代码,当前通过GET获取ID、POST提交更新操作。需要修改为:点击表格中的按钮时,将数据库中的ID存入SESSION,全程不暴露ID信息,规避GET/POST传输数据带来的暴露风险,仅在服务器端存储该ID。

关键改造步骤
- 启动Session:在所有涉及的页面开头添加
session_start(),确保Session功能可用 - 替换GET传参逻辑:点击编辑按钮时,通过POST请求将ID存入Session,不在URL中暴露ID
- 移除表单隐藏ID字段:更新操作直接从Session读取ID,不再通过POST传递ID
- 增加Session校验:防止未授权访问更新页面
改造后的完整代码
1. 用户列表页面(view.php,含编辑按钮)
将原列表中的编辑链接改为POST表单,提交ID并存入Session:
<?php session_start(); include "config.php"; // 处理编辑按钮提交,将ID存入Session if(isset($_POST['edit_user'])){ $user_id = $_POST['user_id']; // 可选:校验ID合法性,避免非法ID存入Session $check_sql = "SELECT id FROM users WHERE id = '$user_id'"; $check_result = $conn->query($check_sql); if($check_result->num_rows > 0){ $_SESSION['edit_user_id'] = $user_id; header("Location: update.php"); exit; }else{ header("Location: view.php"); exit; } } // 查询用户列表的逻辑... ?> <!-- 列表中的编辑按钮改为内嵌POST表单 --> <?php foreach($users as $user): ?> <tr> <td><?php echo $user['firstname']; ?></td> <!-- 其他用户信息列... --> <td> <form method="post" action="" style="display:inline;"> <input type="hidden" name="user_id" value="<?php echo $user['id']; ?>"> <button type="submit" name="edit_user">编辑</button> </form> </td> </tr> <?php endforeach; ?>
2. 用户更新页面(update.php)
<?php session_start(); include "config.php"; // 校验Session中是否存在编辑ID,无则跳转回列表 if(!isset($_SESSION['edit_user_id'])){ header("Location: view.php"); exit; } $user_id = $_SESSION['edit_user_id']; // 处理更新提交 if (isset($_POST['update'])) { $firstname = $_POST['firstname']; $lastname = $_POST['lastname']; $email = $_POST['email']; $password = $_POST['password']; $gender = $_POST['gender']; // 建议使用预处理语句防止SQL注入,此处保留原逻辑示例 $sql = "UPDATE `users` SET `firstname`='$firstname',`lastname`='$lastname',`email`='$email',`password`='$password',`gender`='$gender' WHERE `id`='$user_id'"; $result = $conn->query($sql); if ($result == TRUE) { echo "记录更新成功。"; // 更新完成后清除Session中的ID,避免误操作 unset($_SESSION['edit_user_id']); }else{ echo "错误:" . $sql . "<br>" . $conn->error; } } // 查询待编辑用户信息 $sql = "SELECT * FROM `users` WHERE `id`='$user_id'"; $result = $conn->query($sql); if ($result->num_rows > 0) { $row = $result->fetch_assoc(); // ID唯一,无需循环 $first_name = $row['firstname']; $lastname = $row['lastname']; $email = $row['email']; $password = $row['password']; $gender = $row['gender']; ?> <!DOCTYPE html> <html> <body> <h2>用户信息更新表单</h2> <form action="" method="post"> <fieldset> <legend>个人信息:</legend> 名字:<br> <input type="text" name="firstname" value="<?php echo $first_name; ?>"> <br> 姓氏:<br> <input type="text" name="lastname" value="<?php echo $lastname; ?>"> <br> 邮箱:<br> <input type="email" name="email" value="<?php echo $email; ?>"> <br> 密码:<br> <input type="password" name="password" value="<?php echo $password; ?>"> <br> 性别:<br> <input type="radio" name="gender" value="Male" <?php if($gender == 'Male'){ echo "checked";} ?> >男 <input type="radio" name="gender" value="Female" <?php if($gender == 'Female'){ echo "checked";} ?>>女 <br><br> <input type="submit" value="更新" name="update"> </fieldset> </form> </body> </html> <?php } else{ unset($_SESSION['edit_user_id']); header('Location: view.php'); } ?>
注意事项
- 所有使用Session的页面必须在最开头调用
session_start(),且函数前不能有任何输出(包括空格、换行) - 生产环境中建议使用PDO预处理语句替代直接拼接SQL,彻底防范SQL注入风险
- 更新完成后及时清除Session中的ID,避免用户后续误操作
内容的提问来源于stack exchange,提问作者technical
相关产品推荐
相关产品推荐

