You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

登录后无法跳转至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();
?>

修复要点

  1. 修正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;
    }
    ?>
    
  2. 确保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();
    // ... 后续代码
    ?>
    
  3. 避免输出干扰跳转逻辑
    login.php中的ob_end_flush();可能导致提前输出内容,破坏header跳转。建议将其移至脚本末尾,或直接移除(若未开启输出缓冲)。同时确保脚本开头无空格、HTML标签等意外输出。

  4. 修复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,提问作者緯緯緯

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 05:53:23