【问题标题】:Issues With PHP SessionPHP 会话的问题
【发布时间】:2012-04-15 14:30:13
【问题描述】:

我正在尝试在 3 个 php 页面之间创建一个非常简单的会话:index.php、validate.php 和 target.php index.php

<?php
session_start();
$_SESSION['uid'] = 'test';
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Start A Session</title>
</head>  
<body>
<h1>Welcome to Heaven</h1>
<form method="POST" action="validate.php">
Your Name: <input type="text" name="name" value="" />
<input type="submit" value="Submit" />
</form>
</body>
</html>

和 validate.php 为:

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

最后是 target.php

<?php
session_start();
?>
<!DOCTYPE HTML>
<html>
<head>
<title>Start Email with PHP</title>
</head>
<body>
<h1>Welcome to Targer <?php echo $_SESSION['uid'] ?></h1>
<img src="session.jpg">
</body>
</html>

现在我的问题是:

  1. 当我已经在页面之间设置了会话时,为什么用户仍然可以访问目标页面(根据我对会话的理解,除非已提交正确的 seesion 值但我可以访问目标页面,否则不得访问目标页面通过单击 wamp 索引列表中的页面链接进行页面!并回显 $err; !)
  2. 我尝试使用 isset() 验证 $_SESSION 值,但它没有通过!请告诉我如何使用 isset() 而不是 if(($_POST['name']) == $_SESSION['uid']) comarison 修改 validate.php?
  3. 您能否告诉我如何将两个(index.php 和 validate.php)合并到一个页面中?我的意思是如何验证 index.php 中的会话并减少两个索引和目标文件?在这种情况下,我需要处理索引页面中的错误登录。
  4. 最后,您能否告诉我如何从用户输入中将值分配给 $_SESSION?我的意思是不要像 $_SESSION['uid'] = 'test'; 这样的硬编码部分。让会话值从用户输入开始!我知道这在这里看起来毫无意义,但我想了解在同一索引页面中创建验证码

提前感谢您的宝贵时间

【问题讨论】:

    标签: php session


    【解决方案1】:

    这应该可以正常工作,并且只需要 2 个文件。您甚至可以将其压缩为 1 个文件,如果您真的需要(这更难理解),请索取,我可以制作。

    index.php:

    <?php
    session_start();
    $_SESSION['uid'] = 'test';
    ?>
    <!DOCTYPE HTML>
    <html>
        <head>
        <title>Start A Session</title>
        </head>  
        <body>
        <h1>Welcome to Heaven</h1>
        <form method="POST" action="heaven.php">
            Your Name: <input type="text" name="name" value="" />
            <input type="submit" value="Submit" />
        </form>
        </body>
    </html>
    

    还有另一个文件,天堂.php

    <?php
    session_start();
    if (!empty($_SESSION['uid'])&&$_POST['name']==$_SESSION['uid'])
        {
        ?>
        <!DOCTYPE HTML>
        <html>
        <head>
        <title>Start Email with PHP</title>
        </head>
        <body>
        <h1>Welcome to Targer <?php echo $_SESSION['uid'] ?></h1>
        <img src="session.jpg">
        </body>
        </html>
        <?php
        }
    else
        {
        ?>
        <!DOCTYPE HTML>
        <html>
        <head>
        <title>Access denied</title>
        </head>
        <body>
        Sorry, you have no permission to access this page.
        </body>
        </html>
        <?php
        }
    ?>
    

    “验证”只是在字符串匹配时显示所需的消息,或者在字符串不匹配时显示“您看不到此页面”。

    需要设置 !empty()。否则,想象一下如果有人在没有先访问 index.php 的情况下访问了“heaven.php”页面会发生什么。您将比较 2 个空字符串!所以它会被验证。另一种方法是把 $_SESSION['uid'] = 'test'; Heaven.php 的开头也是。

    我并没有真正按顺序回答您的问题(在第二个问题中我作弊了,因为我将第二个和第三个文件放在一起而不是第一个和第二个文件),但我的代码应该涵盖您的所有问题。对于最后一部分,它只是 $_SESSION['uid']=$_POST['name']; ,但是在验证用户时这样做是没有意义的。验证必须来自某个地方,通常来自 mysql 数据库。

    如果有效,请开始接受您的问题的答案(在向上/向下按钮下方)。

    【讨论】:

      【解决方案2】:

      1) 分配正确的会话值是什么意思? “heaven.php”是一个任何人都可以访问的文件,如果您不检查该文件的访问权限。

      2) 不确定你的意思。如果您需要检查两个变量是否存在并匹配,您需要类似if ( (isset($_POST['name']) &amp;&amp; isset($_SESSION['uid'])) &amp;&amp; (($_POST['name']) == $_SESSION['uid']) )

      3) 如果不需要将文件减少到最小,最好在各自的文件中保持验证、表单处理等功能。如果您想验证“index.php”中的会话和表单值,您可以先检查这些值是否存在,然后对它们进行任何您喜欢的操作。 (就像上面的 2 一样。)

      4) 您可以使用表单为变量分配用户输入的值。这就是您当前对表单所做的事情。在您处理文件/函数时,您可以执行以下操作:

      if(isset($_POST['submit']){
        $_SESSION['uid'] == $_POST['name'];
      }
      

      上面的例子非常简化。

      最后。您并没有真正验证任何内容,您只需检查两个值是否匹配。验证意味着您确保值符合指定的标准,例如用户提交的值是一个整数,而它应该是一个整数(当插入数据库或使用其他方式时)。我认为你应该先看看一些关于表单处理和用户输入验证的教程,然后再创建任何用于生产环境的东西。

      【讨论】:

        猜你喜欢
        • 2010-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多