无法使用电子邮件或移动设备登录

时间:2018-03-05 10:42:09

标签: php mysql

我正在尝试使用电子邮件或移动设备(在PHP和MySQL中)登录。但是我无法登录。

这是我的代码:

$sql = "SELECT * FROM tb_users WHERE (email='$loginEmailOrMobile' AND password='$loginPassword') OR (mobile_number='$loginEmailOrMobile' AND password='$loginPassword')";
$mysql = mysql_query($sql) or die(mysql_error());
if(mysql_num_rows($mysql) == 1)
{
    echo "login successful";
    $user = mysql_fetch_object($mysql);
    echo $user->username;
}
else
{
    die(mysql_error());
}

1 个答案:

答案 0 :(得分:1)

我认为您的代码中存在许多问题。

  1. 不推荐使用mysql *扩展,并在PHP 7中删除。
  2. 普通密码的安全性较差。
  3. 使用变量时建议使用预备语句。
  4. 如果没有,则处理错误。
  5. 您可能没有与您的凭据匹配的行(或更多1),因此它既不是成功也不是MySQL错误。
  6. 我不会在这个答案中涵盖所有这些要点,以尊重您的原始代码,但我会尝试解释其中的许多代码。
    首先,有一个经过测试和运行的代码可以完成这项任务。

    <?php
    //Connect to the database
    $mysqli = new mysqli("localhost", "username", "password", "databaseName");
    //These variables may be set from $_POST or anywhere
    //it is only an example
    $loginEmailOrMobile = 'an-email@example.com';
    $loginPassword = '123456';
    //!!Vulnerable to SQL injections**
    $sql = "SELECT * FROM tb_users WHERE password = '$loginPassword' AND (email='$loginEmailOrMobile' OR mobile_number = '$loginEmailOrMobile')";
    $result = $mysqli->query($sql);
    
    //Only if we got 1 result
    if (1 === mysqli_num_rows($result)) {
        $user = mysqli_fetch_object($result);
        echo $user->email;
    } else {
        die('We have not got only one result');
    }
    

    在此代码中,您可以看到:

    • Mysqli用于执行查询。出于安全原因,我们建议使用mysqli而不是mysql。另外,我使用PHP 7而且我没有mysql扩展名。
    • 因为您使用mysql_error()处理的案例不是错误的,所以我已将其删除以便处理案例。如果我得到0,甚至2个结果,那不是MySQL错误,但也许我没有用户或超过1的凭据。
    • 我已经更新了您的SQL查询,以减少冗余,但逻辑是相同的。

    您的SQL查询不是一个准备好的语句,我没有触及它以尊重您的代码而不是完全重写它。但我真的建议你看看mysqli prepared statements

    您似乎正在使用普通密码(除非您已经对其进行了哈希处理)。建议在将密码插入数据库之前对其进行哈希处理,并仅比较哈希值。请查看crypt()