0

你能告诉我为什么我的会话设置不能正常工作吗?我在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() 函数来防止这种情况发生?感谢您的时间和评论

4

5 回答 5

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");
于 2013-04-26T19:27:55.010 回答
1

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

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

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

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

   if($_POST['name'] == $_SESSION['uid']){
      header ("Location: target.php");
   } 
   else
   { 
      echo $err; 
   }
于 2013-04-26T19:26:13.390 回答
1

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

  1. 存储验证结果:

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

    if (!isset($_SESSION['validated'])) {
        header('Location: http://example.com/');
        exit;
    }
    
于 2013-04-26T19:34:39.463 回答
0

如果您关闭并重新打开浏览器,您可以访问 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在没有登录的情况下直接无法访问,那就是这样,

目标.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>
于 2013-04-26T19:31:51.727 回答
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");
}
?>
于 2013-04-26T19:44:12.100 回答