【问题标题】:Having Issue with PHP SessionPHP 会话有问题
【发布时间】:2013-04-26 19:21:20
【问题描述】:

您能否告诉我为什么我的会话设置无法正常工作?我在 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>

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

【问题讨论】:

  • 如果您完全关闭浏览器程序,然后重新打开它,是否会发生这种情况? $_SESSION 设置为在您的浏览器会话期间持续。你可能想调查一下。
  • 您永远不会清除会话变量 - 检查关闭 + 重新打开浏览器是否会改变任何内容
  • 会话保存在浏览器中。所以,如果你最初打开 index.php,它会保留一段时间。
  • 您需要设置注销来销毁会话。此外,如果会话仍然存在,您必须检查每个脚本。
  • 感谢大家的完美提示。我正在检查所有这些

标签: php session session-variables


【解决方案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. 存储验证结果:

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

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

    【讨论】:

      【解决方案3】:

      ($_POST['name']) 将返回一个布尔值,它是一个关于他自己的 if 语句(因为你把它放在了 () 周围。当$_POST 可用时,它会给你一个真值。

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

      这就是为什么它总是出现在header

      所以这应该可以解决您的问题(顺便说一句,有更好的方法)

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

      【讨论】:

      • 为什么这些括号返回一个布尔值?
      • 因为if(($_POST['whatever'])) 检查 $_POST['whatever'] 是否存在 php 将返回一个真值。
      • 我认为您误读了代码。完整的 if() 内容为($_POST['name']) == $_SESSION['uid']
      【解决方案4】:

      你几乎做到了。不需要 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");
      }
      ?>
      

      【讨论】:

        【解决方案5】:

        如果您关闭并重新打开浏览器,您可以访问 target.php。因为一开始在 session 和 post 中没有任何价值

        所以这一行,

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

        等于

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

        你应该使用isset()

        验证.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>
        

        【讨论】:

        • 您好 Ocanal,感谢您的评论,这阻止了对 target.php 和 validate.ph 的直接访问,BUT 也没有从正确的值输入中打开 target.php(测试) 通过表格!你有机会测试它吗?
        • @BehrouzHosseiniK。 ,对不起,我忘了把这行 $_SESSION["logged"] = "logged"; 放在 validate.php 中。我更新了,再检查一下。
        猜你喜欢
        • 1970-01-01
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多