【问题标题】:PHP Header Location Not Redirecting to HTML FilePHP 标头位置未重定向到 HTML 文件
【发布时间】:2014-12-22 15:33:49
【问题描述】:

我正在为我的应用程序运行以下登录脚本。在我自己的家庭服务器上,成功登录后重定向始终有效,并将用户带到他们的私人页面。由于将应用程序上传到 GoDaddy,它不再重定向。

    <?php

    // First we execute our common code to connection to the database and start the session
    require("common.php");

    // This variable will be used to re-display the user's username to them in the
    // login form if they fail to enter the correct password.  It is initialized here
    // to an empty value, which will be shown if the user has not submitted the form.
    $submitted_username = '';

    // This if statement checks to determine whether the login form has been submitted
    // If it has, then the login code is run, otherwise the form is displayed
    if(!empty($_POST))
    {
        // This query retreives the user's information from the database using
        // their username.
        $query = "
            SELECT
                id,
                username,
                password,
                salt,
                email,
                reg_type,
                assoc
            FROM users
            WHERE
                username = :username
        ";

        // The parameter values
        $query_params = array(
            ':username' => $_POST['username']
        );

        try
        {
            // Execute the query against the database
            $stmt = $db->prepare($query);
            $result = $stmt->execute($query_params);
        }
        catch(PDOException $ex)
        {
            // Note: On a production website, you should not output $ex->getMessage().
            // It may provide an attacker with helpful information about your code. 
            die("Failed to run query: " . $ex->getMessage());
        }

        // This variable tells us whether the user has successfully logged in or not.
        // We initialize it to false, assuming they have not.
        // If we determine that they have entered the right details, then we switch it to true.
        $login_ok = false;

        // Retrieve the user data from the database.  If $row is false, then the username
        // they entered is not registered.
        $row = $stmt->fetch();
        if($row)
        {
            // Using the password submitted by the user and the salt stored in the database,
            // we now check to see whether the passwords match by hashing the submitted password
            // and comparing it to the hashed version already stored in the database.
            $check_password = hash('sha256', $_POST['password'] . $row['salt']);
            for($round = 0; $round < 65536; $round++)
            {
                $check_password = hash('sha256', $check_password . $row['salt']);
            }

            if($check_password === $row['password'])
            {
                // If they do, then we flip this to true
                $login_ok = true;
            }
        }

        // If the user logged in successfully, then we send them to the private members-only page
        // Otherwise, we display a login failed message and show the login form again
        if($login_ok)
        {
            // Here I am preparing to store the $row array into the $_SESSION by
            // removing the salt and password values from it.  Although $_SESSION is
            // stored on the server-side, there is no reason to store sensitive values
            // in it unless you have to.  Thus, it is best practice to remove these
            // sensitive values first.
            unset($row['salt']);
            unset($row['password']);

            // This stores the user's data into the session at the index 'user'.
            // We will check this index on the private members-only page to determine whether
            // or not the user is logged in.  We can also use it to retrieve
            // the user's details.
            $_SESSION['user'] = $row;

            // Redirect the user to the private members-only page.
            header('Location: ../private.html');
            die();
        }
        else
        {
            // Tell the user they failed
            print("Login Failed.");

            // Show them their username again so all they have to do is enter a new
            // password.  The use of htmlentities prevents XSS attacks.  You should
            // always use htmlentities on user submitted values before displaying them
            // to any users (including the user that submitted them).  For more information:
            // http://en.wikipedia.org/wiki/XSS_attack
            $submitted_username = htmlentities($_POST['username'], ENT_QUOTES, 'UTF-8');
        }
    }
?>

我可以就如何让 Header 命令工作获得一些建议吗?

【问题讨论】:

  • 在调用 header() 函数之前,请确保您的脚本没有生成任何输出(错误、警告、通知)。
  • 完全偏离主题,但相关:您可能需要考虑在 php 中使用内置的 pbkdf2 函数进行散列。因为它与您在那里所做的几乎相同,但更安全/更容易。 php.net/manual/en/function.hash-pbkdf2.php
  • 在打开 &lt;?php 标签 error_reporting(E_ALL); ini_set('display_errors', 1); 后立即将错误报告添加到文件顶部,看看它是否产生任何结果。如前所述;您可能在标题之前输出。

标签: php html forms header location


【解决方案1】:

php.ini 问题:output_buffering = On 可能是开放的。

请控制标题。

if (!headers_sent()) {
    header('Location: ../private.html');
    exit;
}else{
   echo 'header problems';
}

【讨论】:

  • if($login_ok) 当前为真?请控制。
【解决方案2】:

您的代码是完美的,您还使用 javascript 重定向页面

<script type="text/javascript">
window.location.href = url; or
window.location = url; or
location.replace(url);
</script>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-01
    • 2011-09-22
    • 1970-01-01
    • 2012-02-06
    • 2019-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多