0

谁能告诉我为什么这个简单的 PHP/MySQL 登录代码总是显示“错误的用户名或密码”,即使我输入了正确的用户名/密码组合?我花了很多时间试图弄清楚这一点。

<?php
// Database Connection
mysql_connect("IP", "charlesfries", "Password") or die(mysql_error());
mysql_select_db("charlesfriessdatabase") or die(mysql_error());

// Variables
$username = $_POST["username"]; 
$password = $_POST["password"];

$result = mysql_query("SELECT * FROM accounts WHERE username = '$username' and password = '$password'");

// Success
$count = mysql_num_rows($result);
if ($count == 1) // Checks for Single Record of Given Username & Password
{
    session_register("username"); // Registers Username Key in Session
    session_register("password"); // Registers Password Key in Session
    header("location:http://charliefries.tk/");
}

// Failure
else
{
    echo "Wrong Username or Password";
}
?>

另外,请不要告诉我我的代码是可注入的。我知道它是。

这是我的表单代码:

<form action="signinprocess.php" method="post"> <!-- Sign In Process -->
Username: <input type="text" name="username" style="width:150">
<br />
Password: <input type="password" name="password" style="width:153">
<br />
<br />
<input type="submit" value="Sign In">
</form>
4

2 回答 2

4

在 SELECT 中尝试 LIMIT 1 以确保您只有 1 行。

于 2013-03-02T03:35:45.257 回答
1

您的代码中有一些“坏主意”:

  1. 不要将 mysql_* 用于新项目。这是过时的。切换到 mysqli_* http://php.net/manual/en/book.mysqli.php
  2. 通过用户名和密码进行选择并不总是一个好主意。在大多数情况下,最好搜索用户名并检查密码是否正确。使用准备好的语句,你会得到这样的东西

    选择 * 从accounts哪里username=?

    在下一步中,您可以检查您的密码是否与数据库中的密码相同,例如使用 if 语句 $_POST['password']==$dataFromDB['password']。

  3. 目前您正在以纯文本格式保存密码。这是一个非常糟糕的主意。看看 bcrypt。请参阅如何在 PHP 中使用 bcrypt 对密码进行哈希处理?
  4. session_register 已过时。使用类似的东西

    $_SESSION['username']=$dataFromDB['username']

如我所见,问题出在(不存在的)LIMIT 中。希望这些提示无论如何都会对您有所帮助。

于 2013-03-02T03:41:02.680 回答