PHP登录检查流

PHP登录检查流,php,mysql,login,Php,Mysql,Login,我在使用php登录脚本时遇到了问题(见下文)。如果有人输入了一个不存在的用户名,我想重定向到nouser.php;如果输入了错误的密码(但用户名有效),我想重定向到errowpass.php。下面的代码几乎可以工作。如果我注释掉了整个错误的密码部分,那么nouser部分将按预期工作,显示nouser页面,但是如果我在中保留了错误的密码部分,那么对于nouser和错误的密码情况,我将得到错误的pass.php页面。如果我输入了一个有效的用户,但密码错误,那么我会得到错误的密码(正确的行为)。 简单

我在使用php登录脚本时遇到了问题(见下文)。如果有人输入了一个不存在的用户名,我想重定向到nouser.php;如果输入了错误的密码(但用户名有效),我想重定向到errowpass.php。下面的代码几乎可以工作。如果我注释掉了整个错误的密码部分,那么nouser部分将按预期工作,显示nouser页面,但是如果我在中保留了错误的密码部分,那么对于nouser和错误的密码情况,我将得到错误的pass.php页面。如果我输入了一个有效的用户,但密码错误,那么我会得到错误的密码(正确的行为)。 简单地说,如果没有这个名称的nouser,而不是错误的pass.php页面,我如何确保重定向到nouser.php

<?php
            $username = $_POST['username'];
$password = $_POST['password'];
//connect to the database here

require_once 'includes/login.php';
$db_server = mysql_connect($db_hostname, $db_username, $db_password);
if (!$db_server) die("Unable to connect to MySQL: " . mysql_error());

mysql_select_db($db_database, $db_server)
    or die("Unable to select database: " . mysql_error());


$username = mysql_real_escape_string($username);
$query = "SELECT password, salt
        FROM users
        WHERE username = '$username';";
$result = mysql_query($query);
//wrong user section
if(mysql_num_rows($result) < 1) //no such user exists
{
    header('Location: nouser.php');
}
//wrong password section
$userData = mysql_fetch_array($result, MYSQL_ASSOC);
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
if($hash != $userData['password']) //incorrect password
{
    header('Location: wrongpass.php');
}
//login successful


?>
我认为应该添加die()来停止脚本

if(mysql_num_rows($result) < 1) {
    header('location:nouser.php');
    die();
}
if(mysql\u num\u行($result)<1){
标题('location:nouser.php');
模具();
}

尚未测试代码。

值得注意的是,mqsql_uuo已被弃用。您应该改为使用mysqli。我最近进行了切换,实际上mysqli的OO特性(您可以但不必使用)非常好。值得注意的是,您通过使用两个nouser和错误密码的目标脚本来泄露信息。明白我的意思了吗?你应该只建议用户名和密码的组合是无效的,否则你会告诉人们他们猜到了一个有效的用户名,现在他们只需要猜密码。我会调查的,mysqli-谢谢你,我理解不要泄露用户的错误行为(用户名或密码),这只是测试的初始设置,我将更改。此外,这是一个内部应用程序,我不需要太安全,但我认为你们的观点,这将是一个很好的做法,以改变它无论如何。谢谢,伙计,这似乎管用,谢谢。我想了想,但觉得它可能会破坏其他东西。真的应该试一下。是的,断模退出bailout@user2332903但是我认为你不应该创建自己的登录名。php许多身份验证插件将帮助你,而且更安全。你也可以使用
exit()
:)@gilbertxenodike-我这样做有两个原因。一个是我自己业务的应用程序,只能在内部访问,因此安全性不是一个大问题;第二,我这样做是为了学习,所以自己动手比使用插件更有价值。如果这是我为客户/客户等构建的东西,我同意