登录后无法跳转至draw.php页面的技术问题求助
登录重定向问题修复建议
问题现象
- 平台:000webhost.com(无法修改php.ini)
- 输入正确账号密码登录后,页面重定向回login.php
- 输入错误账号密码时,正常提示登录失败
- 移除draw.php的SESSION验证逻辑后,登录可正常跳转至draw.php
相关代码
draw.php
<?php session_start(); if (!isset($_SESSION['user_id']) || empty($_SESSION['user_id'])) { header("Location: login.php"); exit; } if (isset($_SESSION['username']) && !empty($_SESSION['username'])) { $username = $_SESSION['username']; } else { echo "User account not obtained"; exit; } ?>
login.php
<?php if ($_SERVER['REQUEST_METHOD'] === 'POST') { $username = $_POST['username']; $password = $_POST['password']; $sql = "SELECT * FROM user WHERE username = '$username' AND password = '$password'"; $result = $conn->query($sql); if ($result->num_rows > 0) { $member = $result->fetch_assoc(); $_SESSION['user_id'] = $member['user_id']; $_SESSION['username'] = $member['username']; session_start(); header("Location: draw.php"); exit; } else { echo "Login failed: wrong account or password"; } } $conn->close(); ob_end_flush(); ?>
修复要点
修正session_start()调用时机
login.php中在设置SESSION变量后才调用session_start(),会导致SESSION数据无法被正确写入。必须将session_start();移至脚本最顶部,且仅调用一次,删除设置SESSION后的重复调用:<?php session_start(); // 移到最顶部 if ($_SERVER['REQUEST_METHOD'] === 'POST') { // ... 原有代码 // 移除此处的session_start(); header("Location: draw.php"); exit; } ?>确保SESSION Cookie参数适配平台环境
由于无法修改php.ini,可在session_start()前手动设置Cookie参数,保证SESSION能跨页面传递:<?php session_set_cookie_params([ 'lifetime' => 3600, 'path' => '/', 'domain' => $_SERVER['HTTP_HOST'], 'secure' => isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on', 'httponly' => true, 'samesite' => 'Lax' ]); session_start(); // ... 后续代码 ?>避免输出干扰跳转逻辑
login.php中的ob_end_flush();可能导致提前输出内容,破坏header跳转。建议将其移至脚本末尾,或直接移除(若未开启输出缓冲)。同时确保脚本开头无空格、HTML标签等意外输出。修复SQL注入漏洞(重要)
当前代码直接拼接POST参数到SQL语句,存在严重安全风险,改用预处理语句:$sql = "SELECT * FROM user WHERE username = ? AND password = ?"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $username, $password); $stmt->execute(); $result = $stmt->get_result();另外,密码禁止明文存储,应使用
password_hash()加密存储,登录时用password_verify()验证:// 注册时加密密码 $hashed_pwd = password_hash($password, PASSWORD_DEFAULT); // 登录时验证 if (password_verify($password, $member['password'])) { // 验证通过,设置SESSION }
内容的提问来源于stack exchange,提问作者緯緯緯
相关产品推荐
相关产品推荐

