使用标题(“位置”)登录后重定向用户不起作用

时间:2016-09-02 11:39:35

标签: php redirect

我遇到了重定向用户的问题。我想在我指定的页面上登陆用户。

我试过

header("Location: http://www.website.com"); 

但它不起作用。

当我使用正确的密码和电子邮件以测试用户身份登录时,login.php页面保持不变。我希望用户改为index.php

我的第二个问题是,如果用户未登录并尝试输入index.php,我该如何将用户重定向到登录页面(login.php)

这是我的登录代码(login.php) 注意:(所有php代码都在html行之上)

<?php
session_start();
$message = "";
if (count($_POST) > 0) {
    $conn = mysql_connect("localhost", "user name", "password") or die(mysql_error());
    mysql_select_db("db_name", $conn);
    $result = mysql_query("SELECT * FROM users WHERE user_name='" . $_POST["user_name"] . "' and password = '" . $_POST["password"] . "'");
    $row = mysql_fetch_array($result);
    if (is_array($row)) {
        $_SESSION["user_id"] = $row[user_id];
        $_SESSION["user_name"] = $row[user_name];
    } else {
        $message = "Invalid Username or Password!";
    }
}
if (isset($_SESSION["user_id"])) {
    header("Location: login.php");
}
?>

我想重定向用户,如果没有登录,则想登陆login.php上的用户

4 个答案:

答案 0 :(得分:2)

你在这里遇到一些问题:Sql注入,密码存储为纯文本,你使用已从PHP 7中删除的已弃用的mysql_*函数。

除此之外,你的逻辑错误:

if (isset($_SESSION["user_id"])) {
    header("Location: login.php");
}

应该是:

if (!isset($_SESSION["user_id"])) {
//  ^ redirect to login if the variable is NOT set
    header("Location: login.php");
}

有关sql注入/准备语句和密码哈希的详细信息,请参阅以下链接:

答案 1 :(得分:0)

检查login.php中起始<?php标记上方是否有空行。

你的查询中也有mysql注入。如果输入' or 'a'='a作为密码,则查询将为

"SELECT * FROM users WHERE user_name='' and password = '' or 'a'='a'"

所以它会忽略任何用户名或密码保护。您需要转义传递给查询的变量。最简单的方法是

"SELECT * FROM users WHERE user_name='" . addslashes($_POST["user_name"]) . "' and password = '". addslashes($_POST["password"]) ."'"

How can I prevent SQL injection in PHP?

您的代码还存在其他一些问题:

mysql_fetch_array返回表单array(0 => 'field value 1', 1 => 'field value 2')的数组,依此类推。对于关联数组(字段名称为数组键),您需要mysql_fetch_assoc

$row[user_id]这里的user_id是一个常量,但是如果没有设置它会返回一个字符串user_id,但你应该避免这种用法并以正确的方式进行$row['user_id']

$row = mysql_fetch_assoc($result);
if (is_array($row)) {
    $_SESSION["user_id"] = $row['user_id'];
    $_SESSION["user_name"] = $row['user_name'];
} else {
    $message = "Invalid Username or Password!";
}

由于您没有触发重定向,唯一的可能是没有找到用户或您有mysql错误。您可以使用echo mysql_error();

进行检查

答案 2 :(得分:0)

1

正如Jeroen正确指出的那样,您需要使用MySQL_停止,因为它已被弃用。无论您的托管服务提供商拥有什么版本的PHP,您都应该努力升级并更新至MySQLi_ 至少,如果没有(有更多时间和学习),您可以使用MySQLi Prepared StatementsPDO Prepared Statements

<强> 2

如果您无法理解PHP脚本正在输出的行为 - 您希望它能够正常工作,那么解决方案几乎总是在PHP错误日志中。请阅读how to output PHP errors。如果您的问题,这将为您提供简明扼要的信息。

3 (这是重要的一点,也是我回答的动力)

虽然Jeroens的回答似乎是正确的,但有一个非常重要的警告已经被遗漏了,那就是一旦你写了重定向标题以将用户带到目标页面,你 必须 使用dieexit命令执行此操作,否则脚本将继续运行,但只会将用户带到“*最后遇到的标题位置”。

一个例子:

if($login === false){
    header("Location: login.php");
}
header("Location: welcome.php");

每次运行时,用户都将被带到welcome.php,因为即使他们没有登录,脚本也会执行两个标题,但只会跟随最近的标题,最后一个标题。

因此,请始终在标头后立即添加exit语句 ,以确保它们按预期重定向。

if($login === false){
    header("Location: login.php");
    exit;
}
header("Location: welcome.php");
exit;

4

在成为习惯之前,请尽量避免不良习惯,正如Jeroen所提到的那样, 不应将密码存储为纯文本 ,至少要研究{{ 3}}

同时引用您的数组键,以便$row[user_id];变为$row['user_id'];

从不 信任用户提供的数据,例如$_POST$_GET$_COOKIE数据,它可以很容易地被篡改和被用户或任何various hashing methods滥用。尝试并习惯使用MITM以及完全转义和清除所有用户提供的数据。

答案 3 :(得分:0)

下面的if语句应在session_start()函数之后;

if (isset($_SESSION["user_id"])) {
header("Location: login.php");
}