使用现有数据库用户进行登录验证 (PHP)

Posted

技术标签:

【中文标题】使用现有数据库用户进行登录验证 (PHP)【英文标题】:Login verification with existing database user (PHP) 【发布时间】:2013-08-29 07:57:50 【问题描述】:

我是 php 新手,我正在尝试在不使用模板代码的情况下创建登录系统。 我连接到以下代码的注册表完全工作并将用户保存到我的数据库中没有任何问题。

现在,这是我的登录代码。我创建了几个用户来使用我的注册表单进行测试。 这就是我在 PHP 中所拥有的:

<?php

session_start();

include_once('classes/connection.php');

if(isset($_POST['username']))
    

if(!empty($_POST['username']) && !empty($_POST['password']))

    $username = mysqli_real_escape_string($link, $_POST['username']);
    $password = md5(mysqli_real_escape_string($link, $_POST['password']));

     $checklogin = mysqli_query($link, "SELECT * FROM tblusers WHERE username = '".$username."' AND password = '".$password."'");

    if(mysqli_num_rows($checklogin) == 1)
    
        $row = mysqli_fetch_array($checklogin);
        $username = $row['username'];
        $email = $row['email'];
        $name = $row['name'];
        $surname = $row['surname'];

        $_SESSION['Username'] = $username;
        $_SESSION['Email'] = $email;
        $_SESSION['Name'] = $name;
        $_SESSION['Surname'] = $surname;
        $_SESSION['LoggedIn'] = 1;

        header('location: index.php');
    
    else
    
        $feedback= "<p>Your account was not found, please try again.</p>";
            
 else 
   
    $feedback= "<p>Please fill in all the blank areas.</p>";

    

?>

这是与此相关的 HTML:

<article>
                <?php if(isset($feedback)): ?> <!-- BEGIN FEEDBACK -->
                    <div id="feedback">
                <?php echo $feedback ?>

                    </div>
                <?php endif; ?>
                <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
                    <h2>Login</h2>

                    <table><tr>
                        <td>Username:</td>
                        <td><input size="10%" id="username" class="form-text" name="username"type="text"/></td></tr>
                    <tr>
                        <td>Password:</td>
                        <td><input size="10%" id="password" class="form-text" name="password" type="password"/></td>
                    </tr>
                    <tr>
                        <td></td>
                        <td><input name="loginknop" type="submit" value="Login" />
                        <a href="register.php">No account? Click here!</a></td>
                    </tr></table>
                </form>
                </article>

对我来说,这一切似乎都是正确的,并且能够发挥作用。但是,每次我测试此登录名时,例如: USERNAME: TEST 和 PASSWORD: TEST123 (作为潜在用户,它已经在我的数据库中),我收到反馈说:“找不到您的帐户,请尝试再次。”

所以我的问题是: 1) 我该如何解决这个问题?我相信我的代码是正确的,但我不知道为什么它一直告诉我我的帐户不存在。

2) 也感谢有关如何改进或缩短此代码的建议,我很想学习

【问题讨论】:

应该是mysqli_real_escape_string($link, md5($_POST['password'])),不过要看你在注册脚本中如何存储密码了。 我不相信那是什么问题,我已经尝试过了,但它给出了相同的结果。但感谢您的意见,我很感激。 能否在执行前回显查询,然后用mysql或phpMyAdmin手动试一试? 在数据库中,密码是“TEST123”还是“22b75d6007e06f4a959d1b1d69b4c4bd”? mysqli_fetch_array($checklogin) 的 var_dump 在 "$checklogin = mysqli_query.." 之后显示什么?尝试在 phpmyadmin 或类似中运行 SQL 以查看是否出现问题。 像您描述的 var_dump 完全没有显示任何内容。就像我说的,我还是 PHP 的新手,但我明白了你想要做的事情,虽然,一无所获并不是一个好兆头,对吧? 【参考方案1】:

这一行:

$password = md5(mysqli_real_escape_string($link, $_POST['password']));

将您输入屏幕的数据TEST123 并创建一个MD5 哈希。 所以它看起来像这样:

22b75d6007e06f4a959d1b1d69b4c4bd

所以如果你说你的数据库有一个

username = 'TEST'
password = "TEST123'

当您进行查询时

$checklogin = mysqli_query($link, "SELECT * FROM tblusers WHERE username = '$username' AND password = '$password' ");

$password will = 22b75d6007e06f4a959d1b1d69b4c4bd 但 tabuser.password 将 = 'TEST123' 因此不会选择该行!

【讨论】:

谢谢,确实是这样,虽然我不知道如何恢复到常规密码? 您不需要返回常规密码,将常规密码存储在数据库中是一种不好的做法,因此,您必须重写您的注册,使其将密码的md5写入基础,而不是真正的密码。另外,考虑一下对您的密码进行 SALT 处理,这样会更安全。 事实上你不能将 md5 哈希返回到它的原始数据值,你只能像你一样比较重新哈希,但是你需要将 `md5('TEST123') 存储到创建用户时数据库上的密码字段。 感谢您的回复,我发现了错误,我会尽快更新这个主题!【参考方案2】:

你只需要在你的 php 文件中添加一些调试代码行,这样你就可以找到问题所在。

例如:

if(!empty($_POST['username']) && !empty($_POST['password']))

    echo "You entered: username=$_POST['username'], password=$_POST['password']<br>";
    $username = mysqli_real_escape_string($link, $_POST['username']);
    $password = md5(mysqli_real_escape_string($link, $_POST['password']));

    echo "Your username after escaping: $username<br>";
    echo "Your password after scaping and MD5: $password<br>";

    $checklogin = mysqli_query($link, "SELECT * FROM tblusers WHERE username = '".     
    $username."' AND password = '".$password."'");

    echo "Count of users with the same username and password = " . mysqli_num_rows($checklogin);

    $checkusername = mysqli_query($link, "SELECT * FROM tblusers WHERE username = '". $username."'");
    echo "Count of users with the same username = " . mysqli_num_rows($checkusername);

    $checkpass = mysqli_query($link, "SELECT * FROM tblusers WHERE password = '". $password."'");
    echo "Count of users with the same password md5 = " . mysqli_num_rows($checkpass);


    if(mysqli_num_rows($checklogin) == 1)
    
        $row = mysqli_fetch_array($checklogin);
        $username = $row['username'];
        $email = $row['email'];
        $name = $row['name'];
        $surname = $row['surname'];

        $_SESSION['Username'] = $username;
        $_SESSION['Email'] = $email;
        $_SESSION['Name'] = $name;
        $_SESSION['Surname'] = $surname;
        $_SESSION['LoggedIn'] = 1;

        //header('location: index.php'); <-- comment it to see debug info

之后你就可以看到问题所在了。我现在看到的可能是:

    您在错误的 POST 变量中发送用户名或密码 您以某种不同的格式存储您的用户名或密码

附:如果它对您没有帮助,请在此处发布您在登录尝试后获得的所有这些回声的输出!

【讨论】:

OUTPUT: 你输入: username=joeri, password=joeri 你转义后的用户名: joeri 你转义后的密码和 MD5: f42d4160f1faa7a5fbaee0b0f5421982 用户名和密码相同的用户数 = 0 用户名和密码相同的用户数username = 1Count of users with the same password md5 = 0 我明白你在这里做什么,非常ncie的工作方式。所以基本上,他将我的密码返回为 MD5 而不是真正的密码。关于如何解决这个问题的任何想法? 将这段代码放在这里,将用户数据写入数据库,然后进行注册。很明显,您的密码以其他格式存储,而不是您尝试通过 SELECT 从 DB 获取它。

以上是关于使用现有数据库用户进行登录验证 (PHP)的主要内容,如果未能解决你的问题,请参考以下文章

强制 Laravel 使用旧版身份验证登录用户

使用 php 和 ajax 进行登录表单验证

使用现有数据库表中的用户名和密码在 Blazor 中进行身份验证?

验证 socket.io/nodejs 的用户

如何在 json 的帮助下使用 PHP、MySql 在 android 中验证用户登录凭据

Facebook SDK:验证请求,以便 php 服务器知道它来自登录用户