表单提交数据跨页面无法访问,点击首页按钮触发错误求助
问题分析与解决方案
问题根源
- 首页依赖POST数据,二次访问无数据:首次进入首页是通过登录页
include加载的,此时POST提交的用户名密码仍存在;但再次点击首页按钮是发起GET请求,没有POST参数,$_POST['username']和$_POST['password']未定义,直接调用会触发错误。 - 登录逻辑缺失状态存储:登录页仅验证用户后直接加载首页,未将用户登录状态存入Session,导致页面无法识别已登录用户。
- 严重SQL注入风险:代码直接将用户输入拼接进SQL语句,恶意用户可通过输入特殊字符篡改SQL,窃取或破坏数据库数据。
修复步骤
1. 修复登录页面代码
将用户信息存入Session,验证成功后跳转至首页,避免直接include:
<?php session_start(); require 'dbconnect.php'; // 先检查POST数据是否存在 if (!isset($_POST['username'], $_POST['password'])) { header("Location: index.php"); exit; } $uname = $_POST['username']; $pword = $_POST['password']; // 使用预处理语句防止SQL注入 $query = "SELECT * FROM tbl_users WHERE username = ? AND password = ?"; $stmt = $conn->prepare($query); $stmt->bind_param("ss", $uname, $pword); $stmt->execute(); $result = $stmt->get_result(); $numrows = $result->num_rows; if ($numrows == 1) { // 将用户信息存入Session $_SESSION['user'] = $result->fetch_assoc(); // 跳转至首页,避免重复提交表单 header("Location: homepage.php"); exit; } else { echo "<script>alert('用户不存在,请注册');document.location='index.php'</script>"; } ?>
2. 修复首页代码
从Session获取用户状态,移除不必要的数据库查询,同时增加登录校验:
<?php session_start(); require 'dbconnect.php'; // 校验用户是否已登录,未登录则跳转至登录页 if (!isset($_SESSION['user'])) { header("Location: index.php"); exit; } // 已登录,直接渲染页面 echo "<ul>"; echo "<li><a href='logout.php'><b>Log out</b></a></li>"; echo "<li><a href='SlrSystem.html'><b>Solar System</b></a></li>"; echo "<li><a href='about-us.php'><b>About Us</b></a></li>"; echo "<li><a href='homepage.php'><b>Home</b></a></li>"; echo "</ul>"; echo "<div class='home'>"; echo "<h1 class='right'><b>EXPLORE<br></b></h1>"; echo "<h1 class='left'><b>THE GALAXY FROM<br></b></h1>"; echo "<h1 class='right'><b>YOUR COUCH</b></h1>"; echo "</div>"; ?>
3. 增加登出页面(logout.php)
清空Session,完成登出:
<?php session_start(); session_unset(); session_destroy(); header("Location: index.php"); exit; ?>
额外注意事项
- 永远不要直接将用户输入拼接进SQL语句,必须使用预处理语句防止SQL注入。
- 密码不应明文存储在数据库中,应使用
password_hash()加密,验证时用password_verify()校验。
内容的提问来源于stack exchange,提问作者Lyean Miranda
相关产品推荐
相关产品推荐

