Php 除了不重定向到另一个页面之外,我的登录也可以正常工作

Php 除了不重定向到另一个页面之外,我的登录也可以正常工作,php,login,hash,salt,Php,Login,Hash,Salt,好的,所以我的登录脚本会识别一个不存在的用户-当密码不正确时它会识别-当提交正确的信息时它会向前移动,但不会移动到正确的页面,尽管我也告诉了它 登入表格: <form name="login" action="login.php" method="post"> Username: <input type="text" name="username" /> Password: <input type="password" name="password"

好的,所以我的登录脚本会识别一个不存在的用户-当密码不正确时它会识别-当提交正确的信息时它会向前移动,但不会移动到正确的页面,尽管我也告诉了它

登入表格:

<form name="login" action="login.php" method="post">
    Username: <input type="text" name="username" />
    Password: <input type="password" name="password" />
    <input type="submit" value="Login" />
</form>

用户名:
密码:
登录脚本:

<?
session_start(); //must call session_start before using any $_SESSION variables
$username = $_POST['username'];
$password = $_POST['password'];

$dbhost = 'localhost';
$dbname = '******';
$dbuser = '******';
$dbpass = '******'; //not really
$conn = mysql_connect($dbhost, $dbuser, $dbpass);
mysql_select_db($dbname, $conn);


$username = mysql_real_escape_string($username);
$query = "SELECT password, salt
        FROM users
        WHERE username = '$username';";
$result = mysql_query($query);
if(mysql_num_rows($result) < 1) //no such user exists
{
    header('Location: login_form.php');
    die();
}
$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
if($hash != $userData['password']) //incorrect password
{
    header('Location: login_form.php');
    die();
}
else
{
    validateUser(); //sets the session data for this user
}


header('Location: membersonly.php');


?>

所以我稍微重写了你的代码。我做了几件事:

  • 我把你的MySQL转换成了MySQLi。MySQL已折旧,将被删除。我使用了OOP风格的MySQLi,但您可以使用过程风格
  • 我更改了您的查询字符串。有时,SQL可能会对格式很挑剔,当您使用“`”字符时,SQL非常喜欢
  • 接下来,我将你的大哈希语句分离出来。这是为了可读性
  • 我还为salt和密码添加了一个“isset”检查。此检查只是确认这些值确实存在
  • 我已经为“login_form.php”添加了“error”变量,我会在发布时删除它,但这给了程序员一个很好的机会,让您看到代码似乎出了什么问题
  • 我现在还将“true”和“303”添加到您设置位置的标题区域。true是一个布尔值,表示是否应覆盖位置的上一个集合标题值。303告诉浏览器它应该“查看其他”
  • 最后,我添加了一些额外的头,旨在消除任何缓存的机会。虽然我不知道有哪种浏览器会缓存请求重定向的页面,但这一切都是关于浏览器如何处理重定向的

  • 希望有帮助

    编辑:
    我还建议删除重定向并查看结果,以确保它不会返回警告。如果只是一个警告,您的脚本仍将执行并重定向,但您永远不会看到错误。

    因此它不会重定向到
    membersonly.php
    ?如果是这样的话,它会重定向到什么?@RMK它会一直返回到login.php,这是一个操作脚本-我测试了一个虚拟用户,并将我带到我创建的失败页面,如果密码输入错误,我还会创建一个失败2页面,这也行得通。它只是让用户从这里进入一个具有已创建会话ID的页面。validateUser()是否进行重定向?我尝试了你的代码,它对我有效(我注释掉了validateUser()。如果您对该行进行注释,它是否正确重定向?
    $username = $_POST['username'];
    $password = $_POST['password'];
    
    $dbhost = 'localhost';
    $dbname = '******';
    $dbuser = '******';
    $dbpass = '******'; //not really
    
    $sql_connection = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
    
    $username = mysql_real_escape_string($username);
    $query = "SELECT password, salt FROM users WHERE username = '$username';";
    $result = $sql_connection->query($query);
    if($result->num_rows != 1) //no such user exists{
        header("Location: login_form.php");
        die();
    }
    $userData = $result->fetch_assoc();
    
    if(!isset($userData['salt']) || !isset($userData['password'])){
        header("Location: login_form.php?error=MissingInformation");
        die();
    }
    
    $salt = $userData['salt'];
    $password_hash = hash('sha256', $password);
    $hash = hash('sha256', $salt . $password_hash);
    $correct_password = $userData['password'];
    if($hash != $correct_password){ // incorrect
        header('Location: login_form.php');
        die();
    }else{
        validateUser(); //sets the session data for this user
    }
    
    header("Location: membersonly.php", true, 303);