【问题标题】:Page Does Not Redirect to Index With Correct Username and Password页面未重定向到具有正确用户名和密码的索引
【发布时间】:2016-05-06 11:45:12
【问题描述】:

我有许多用户可以使用网站的安全部分,现在我正专注于使其能够登录和注销。我无法让这个页面重定向到原始页面。当我第一次访问 index.php 时,它确实会重定向到 Login.php。但是当我在页面中输入正确的用户名和密码并提交时,它只是重定向回 l​​ogin.php。但它没有将 $_SESSION["correct"] 的参数设置为 false,就像它应该重定向回 l​​ogin.php 一样,而是将其设置为 TRUE。在输入正确的用户名或密码之前,甚至不应该设置 $_SESSION["correct"]。这一切都在我的 verify.php 中进行。我正在回显“记录”和“正确”会话数据的值,以验证它们是否已设置以及它们的值是什么。

登录.PHP

<div class="panel panel-default">
    <div class="panel-heading">
        <h3>Administration Login</h3>
    </div>
    <form action="verify.php" method="post">
        <div class="panel-body">
            <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
                <?php
                    echo $_SESSION['logged'] . '<br>';
                    echo $_SESSION['correct'] . '<br>';
                ?>
                <input class="form-control" type="text" placeholder="Username" name="username" id="username" required autofocus>
            </div>
            <div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
                <input class="form-control" type="password" placeholder="Password" name="password" id="password" required>
            </div>
            <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
                <button type="submit" class="btn btn-success btn-block">Login</button>
            </div>
            <div class="col-lg-6 col-md-6 col-sm-6 col-xs-12">
                <button type="reset" class="btn btn-danger btn-block">Clear</button>
            </div>
        </div>
    </form>
</div>

验证.PHP

<?php
    session_start();
    require ("../_php/connectInfo.php");

    $username = mysqli_real_escape_string($conn, $_POST['username']);
    $password = mysqli_real_escape_string($conn, $_POST['password']);
    $query = "SELECT id, username, password FROM info";
    $result = $conn->query($query);
    if ($result->num_rows > 0) {
        while ($row = $result->fetch_assoc()) {
            if ($row['password'] == $password && $row['username'] == $username) {

                $_SESSION["logged"] = TRUE;
                $_SESSION["correct"] = TRUE;
                header("location: index.php");
                exit;
            }
        }
        $_SESSION["correct"] = FALSE;
        header("location: login.php");  
    } else {
        header("location: login.php");  
    }
?>

【问题讨论】:

  • 请使用 PHP 的built-in functions 来处理密码安全问题。如果您使用的 PHP 版本低于 5.5,则可以使用 password_hash() compatibility pack
  • 在需要使用会话变量的每个页面顶部是否都有session_start()
  • 我相信,login.php 确实有,我只是没有列出它,因为在我放置 session_start() 命令的位置之后有机密信息
  • Jay 一旦我能搞定基本功能,我将专注于安全性。
  • 我讨厌人们说“我还没有那么远......”“这个网站不会公开......”“仅用于学校,因此安全无所谓……”。如果教师和教授从一开始就没有谈论安全,那么他们就做错了。他们正在教授草率和危险的编码实践,学生以后将不得不忘记这些实践。我也讨厌人们说,“我稍后会增加安全性......”。如果你第一次没有时间做对,你以后什么时候有时间添加它? ¯\_(ツ)_/¯

标签: php mysql session redirect


【解决方案1】:

您必须使用die();exit; 而不是break;

(...)
while ($row = $result->fetch_assoc()) {
    if ($row['password'] == $password) {

        $_SESSION["logged"] = TRUE;
        $_SESSION["correct"] = TRUE;
        header("location: index.php");
        break;                            #  -----
    }                                     #      |
}                                         #      |
$_SESSION["CORRECT"] = FALSE;             #  <----
header("location: login.php");  
(...)

当您打破while 循环时,您将$_SESSION['CORRECT'] 定义为False 并将用户发送到登录页面,无论如何。

【讨论】:

  • 我这样做了,现在它只停留在 verify.php
  • 我已经复制了你的代码,它对我有用(die)。我不明白你有什么问题。这真是一个奇怪的问题。你有什么方法可以检查错误日志吗?也许可以提供帮助。
  • 我启用了我的所有错误报告并收到以下错误:Warning: Cannot modify header information - headers already sent by (output started at /home/prouda/public_html/cms/verify.php:1) in /home/prouda/public_html/cms/verify.php on line 17
  • 您在此处发布的代码中省略了某些行?因为它是上面代码的第 15 行。 &lt;?php标签之前有什么东西?
  • 不,在此之前不存在任何代码,但是这可能是因为此文件是login.php 上的帖子的操作?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多