PHP会话验证异常:登录后仍被拦截权限页面
PHP Session权限控制失效问题排查与修复
核心问题分析
- Session启动逻辑错误:
if(!isset($_SESSION))的判断不严谨,PHP未启动session时$_SESSION变量本身不存在,该判断无法可靠触发session_start(),应直接在页面顶部无条件启动session。 - Login页面Session初始化滞后:原代码仅在登录成功后才启动session,若前置文件未提前初始化session,会导致会话数据无法正确写入。
- 跳转未终止脚本:
header()跳转后未执行exit()/die(),脚本可能继续运行,导致session数据未完成保存就跳转页面。
修复代码与步骤
1. 修正protect.php
将session启动逻辑改为无条件调用,确保权限校验前session已初始化:
<?php session_start(); if(!isset($_SESSION['id'])){ die("<h1>You don't have permission to see this!</h1>"); } ?>
2. 修正login.php
把session_start()移到页面最顶部,并且在跳转后终止脚本执行:
<?php session_start(); include("conecao.php"); if(isset($_POST['email']) || isset($_POST['senha'])){ if(strlen($_POST['email']) == 0){ echo "Please enter your email!"; } elseif(strlen($_POST['senha']) == 0){ echo "Please enter your password!"; } else { $email = $mysqli->real_escape_string($_POST['email']); $senha = $mysqli->real_escape_string($_POST['senha']); $sql_code = "SELECT * FROM usuarios WHERE email = '$email' AND senha = '$senha'"; $sql_query = $mysqli->query($sql_code) or die("SQL query failed!"); $quantidade = $sql_query->num_rows; if($quantidade == 1) { $usuario = $sql_query->fetch_assoc(); $_SESSION['id'] = $usuario['id']; $_SESSION['nome'] = $usuario['nome']; header("Location: painel.php"); exit(); // 终止脚本,确保session数据写入完成 } else { echo "Incorrect email or password!"; } } } ?>
3. 额外排查要点
- 检查
conecao.php及所有PHP文件,确保<?php标签前无任何空白字符、HTML输出,否则会导致session_start()无法设置cookie(header已发送)。 - 通过
phpinfo()查看session配置,确认session.cookie_path设置为/,保证session cookie在整个站点内有效。 - 清除浏览器缓存与cookie后重新测试登录流程。
内容的提问来源于stack exchange,提问作者João Henrique Esper Leite
相关产品推荐
相关产品推荐

