0

我正在处理留言板,我刚刚开始,现在正在处理登录功能。我有一个问题。每当我尝试获取数据时,它要么什么都不返回,要么返回一个“1”。鉴于我是将 mySQL 与 PHP 集成的新手,我不知道发生了什么。如果你能帮助我弄清楚我做错了什么,那就太好了。

    $query = mysql_query("
    SELECT * FROM users WHERE username='$username'
");

while ($row = mysql_fetch_assoc($query)){
    $dbID = $row['id'];
    $dbUser = $row['username'];
    $dbPass = $row['password'];
}

if ($dbUser = $username && $dbPass = $password) {
    //if user and pass match do stuff
    $_SESSION['username'] = $dbUser;
    $_SESSION['id'] = $dbID;
    $_SESSION['ip'] = $_SERVER['HTTP_USER_AGENT'];
    header("Location: messageboard.php");
}
else {
    //if user and pass dont match do stuff
    $_SESSION['loginError'] = "Your username and password do not match";
    header("Location: login.php");
}

所有代码返回 - ID:用户名:1​​ IP:Mozilla/5.0(Windows NT 6.2;WOW64)AppleWebKit/537.36(KHTML,如 Gecko)Chrome/28.0.1500.95 Safari/537.36

4

1 回答 1

0

首先,正如 andrewsi 所说:$dbUser = $username && $dbPass = $password应该==用来比较值。

第二:这样做是非常脆弱的。

首先,您似乎将密码存储在“明文”中,因此您可以使用直接比较。不要这样做。存储一个(加盐或加胡椒的)哈希,并将用户输入与该哈希进行比较!

第二:您正在使用 WHILE-Loop ( while ($row = mysql_fetch_assoc($query)){) 来设置用户数据。这不是必需的,因为一个用户名应该有一组数据。

第三:您$username在查询中使用。您的示例不包含 的生成$username,但从我在您的源代码中看到的内容来看,它很可能看起来像$username = $_POST["username"].

因此,此时,一个人可能能够修改输入的用户名以接收有效的登录,即使它不是。(SQL 注入)。

转义用户输入(MySQL_real_escape_string()在将其传递给 SQL 查询之前使用。

于 2013-08-16T17:47:07.097 回答