遇到PHP会话问题

时间:2013-04-26 19:21:21

标签: php session session-variables

您能告诉我为什么我的会话设置无法正常工作吗?我在 index.php 文件中有一个简单的表单:

<?php
  session_start();
   $_SESSION['uid'] = 'test';
?>

<!DOCTYPE HTML>
   <html>
   <body>
   <form method="POST" action="validate.php">
     Password: <input type="text" name="name" value="" />
    <input type="submit" value="Submit" />
   </form>
</body>
</html>

我还有一个 validate.php 文件,如下所示:

<?php
  session_start();
   $err="You Have to Insert The Password to Get into Page";

   if(($_POST['name']) == $_SESSION['uid']){
      header ("Location: target.php");} 
     else{ echo $err; }
 ?>

最后 target.php 页面就像这样

<?php
 session_start();
?>

<!DOCTYPE HTML>
<html>
<body>
<img src="session.jpg">
</body>
</html>

现在我的问题是,直接从浏览器地址栏运行validate.php或target.php URL,如(..localhost / PHP / Session_3 / validate.php)我仍然可以访问目标页面! 你能告诉我为什么会这样吗?以及如何设置更好的isset()函数来防止这种情况? 谢谢你的时间和评论

5 个答案:

答案 0 :(得分:1)

($_POST['name'])将返回一个布尔值,它是自己的if语句(因为你放置了()。它会给你一个真正的值,当它$_POST可用。

所以你得到的是if ((True) == $_SESSION['uid'])。因为代码看到了True值,所以它不会在它之后运行代码,因此它已经完全正确。

这就是为什么它始终是header

所以这应该可以解决你的问题(有更好的方法来做到这一点)

   if($_POST['name'] == $_SESSION['uid']){
      header ("Location: target.php");
   } 
   else
   { 
      echo $err; 
   }

答案 1 :(得分:1)

您必须在加载的每个页面上检查会话

添加

if(!isset($_SESSION['uid'])){
      header ("Location: index.php");
}

可能对每个页面都有帮助。并且不要忘记在每次注销时删除会话。

//Four Steps to close a session
//i.e. logging out

//1. Find the Session
session_start();

//2. Unset all the session variables
$_SESSION=array();

//3. Destroy the session cookie
if(isset($_COOKIE[session_name()])){
    setcookie(session_name(),'',time()-42000,'/');
}

//4. Destroy the session
session_destroy();

//redirect_to("index.php?logout=1");

答案 2 :(得分:1)

您有验证密码的代码,但这是您迄今为止所写的全部内容。您既不存储验证结果,也不阻止访问受保护页面。

  1. 存储验证结果:

    if ($_POST['name']==$_SESSION['uid']) {
        $_SESSION['validated'] = true;
    }
    
  2. 保护页面:

    if (!isset($_SESSION['validated'])) {
        header('Location: http://example.com/');
        exit;
    }
    

答案 3 :(得分:0)

如果您关闭并重新打开浏览器,则可以访问target.php。因为在开始时会话和帖子中没有值

所以这一行,

if(($_POST['name']) == $_SESSION['uid'])

等于

if ( "" == "" )  //true

您应该使用isset()

validate.php

<?php
  session_start();
   $err="You Have to Insert The Password to Get into Page";

   if (isset($_POST['name']) && isset($_SESSION['uid'])) {
      if ($_POST['name'] == $_SESSION['uid']) {
          $_SESSION["logged"] = "logged";
          header ("Location: target.php");
      } else {
          echo $err; 
      }
   } else {
      header ("Location: index.php");
   }
 ?>

如果你想在没有记录的情况下直接使target.php无法访问,那就是这样,

target.php

<?php
  session_start();
  if (!isset($_SESSION["logged"])) {
      //No access directly if not logged
      header ("Location: index.php");
  }
 ?>

<!DOCTYPE HTML>
<html>
<body>
<img src="session.jpg">
</body>
</html>

答案 4 :(得分:0)

你差不多完成了。不需要validate.php。只需复制index.php中的代码,

<?php
 session_start();
 if(!empty($_POST['name']) and ($_POST['name']=='test') ){
   $_SESSION['uid']='test';
   header ("Location: target.php");
 }

?>

并将表单操作更新为

<form method="POST" action="**index.php**">

并以index.php形式,使用下面的代码。

 <?php
session_start();
if(empty($_SESSION['uid'])){
    header ("Location: index.php");
}
?>