PHP登录系统任何密码都有效

时间:2015-05-27 22:07:45

标签: php mysql database

我正在尝试登录系统,我遇到了一个我似乎无法解决的问题。以下是我的所有代码。

如果您在第43行下输入 echo" $ password&#34 ;; ,请参阅我设置的密码。 em> $ password = md5(md5(" j3d4k",$ password)); 。然后在浏览器上它给你那个代码,所以我把那些代码放在我的数据库的密码中,就像我看过的教程所说的那样。现在它允许我以任何密码登录我的用户。所以我决定将密码设置为密码1一分钟,看看我是否可以使用该密码登录,如果我输入了错误的密码,它就不会让我。仍然失败了。它现在不允许我输入任何密码,说明它们都不正确。

的login.php

<?php
error_reporting (E_ALL ^ E_NOTICE);
session_start();
?>
<!DOCTYPE html>
<html>
<head>

<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Login</title>

<style>

</style>

</head>
<body>
<?php 

    $form = "<form action='./login.php' method='post'>
    <table>
    <tr>
        <td>Username:</td><td><input type='text' name='user' placeholder='Username' /></td>
    </tr>
    <tr>
        <td>Password:</td><td><input type='password' name='password' placeholder='Password' /></td>
    </tr>
    <tr>
        <td></td>
        <td><input type='submit' name='loginbtn' value='Login' /></td>
    </tr>
    </table>
    </form>";

    if ($_POST['loginbtn']){
        $user = $_POST['user'];
        $password = $_POST['password'];

        if ($user){
            if ($password){
                require("connect.php");

                $password = md5(md5("j3d4k",$password));                
                // make sure login info correct                         
                $query = mysqli_query($con, "SELECT * FROM users WHERE username='$user'");
                $numrows = mysqli_num_rows($query);
                if ($numrows == 1){
                    $row = mysqli_fetch_assoc($query);
                    $dbid = $row['id'];
                    $dbuser = $row['username'];
                    $dbpass = $row['password'];
                    $dbactive = $row['active'];

                    if ($password == $dbpass){
                        if ($dbactive == 1){

                            // set session info
                            $_SESSION['userid'] = $dbid;
                            $_SESSION['username'] = $dbuser;

                            echo "You have been logged in as <b>$dbuser</b>. <a href='./member.php'>Click here</a> to go to the member page";

                        }
                        else
                            echo "You must activate your account to login. $form";
                    }
                    else
                        echo "You did not enter the correct password. $form";
                }
                else
                    echo "The username you entered was not found. $form";

                mysqli_close($con);
            }
            else
                echo "You must enter your password. $form";
        }
        else
            echo "You must enter your username. $form";
    }
    else
        echo $form;

?>
</body>
</html>

connect.php

<?php

$con = mysqli_connect("localhost", "Joshua", "Danielle104");
mysqli_select_db($con, "user");

?>

2 个答案:

答案 0 :(得分:1)

您问题中的所有内容实际上都与预期的完全一样(您不应该在第二个方案中使用密码password1进行连接,因为您在数据库中的条目&#34;密码1&#34;没有&#39; t匹配表单中输入的密码的哈希

唯一可疑的是,当您将数据库中的password设置为您打印的哈希时,您可以使用任何密码登录。这显然不是预期的行为。

我的猜测是你实际上在$password中定义了一个名为connect.php的全局变量,可能带有你的数据库密码。这样,通过行43$password的值将始终相同,无论您在表单中输入什么密码,因此哈希也将是相同的。要进行确认,请在$password之后立即打印require('connect.php')的值,并查看是否是您在表单中输入的密码。

答案 1 :(得分:-1)

尝试使用hash()功能。

例如,在数据库密码列中设置哈希值(&#34; sha256&#34;,&#34; j3d4k&#34;)。结果将是&#34; 0dd15cf0c18375808efdbb7f7180526a6355fe02db72365d1ea0c70165e868d0&#34;。

然后,当您检查时,在用户输入上使用相同的哈希值,然后与存储的密码进行比较。

$password = hash("sha256", $_POST['password']);

更新: 顺便说一下 - 你的代码很容易受到SQL注入攻击。 从不直接在查询中使用用户输入。