2

所以我的登录脚本有问题。我在我的数据库中存储了一个加盐的 MD5 哈希,而且……当我使用此语句后跟此代码时,无论密码是什么,它都会登录。

我不确定它是否是语法,或者只是我使用它的方式,但如果用户存在,即使密码是“lalala”并且人输入“chicken”,它也会登录。

$sql = ("select * from website where `Email`='$user' and `Password`='$pass'");
$query = mysql_query($sql);
if ($query) {
    $data = mysql_fetch_array($query, MYSQL_ASSOC);
    if (sizeof($data) > 0) {
        $_SESSION['vuser'] = $_POST['vuser'];
        header('Location: /');
        die;
    }
}

这是它的运行方式:

index.php --> Presses login (Sends POST data) --> login.php (This script) --> (如果登录则返回/index.php,否则返回/login .php。

我在那里有一个名为“blah”的测试帐户,盐渍 MD5 哈希为“lolcatz”。如果我在用户名部分输入“blah”,密码为“stackoverflow”,它将转到“index.php”有什么想法吗?

4

5 回答 5

2

尝试print_r($data)查看mysql_fetch_array函数返回的内容。可能是它返回 FALSE,这将超出您的条件if (sizeof($data) > 0)

于 2013-10-04T20:32:08.817 回答
1

据说,你也可以使用下面类似的mysqli

$dbq=("SELECT * FROM users where username='$uname'");
$dbresult=mysqli_query($con,$dbq);

其中 $con 是您必须在 mysqli 中编写的连接查询。

现在您可以在下面获取类似的数据。

$obj=$dbresult->fetch_object();
$dbmail=$obj->Email;
$dbuname=$obj->Password;
于 2013-10-04T20:39:07.640 回答
1

你的逻辑不正确。mysql_fetch_array()将返回一个数组,该数组表示查询结果中的一行数据,或者在失败的情况下返回一个布尔值 FALSE(查询没有行,或者您从查询结果之外的其他内容中获取)。

你应该这样做:

$result = mysql_query($sql) or die(mysql_error());
if (mysql_num_rows($result) > 0) {
    ... user exists ...
} else {
    ... user does not exist ...
}
于 2013-10-04T20:31:36.900 回答
1

不要使用这个:

if ($query) {
    $data = mysql_fetch_array($query, MYSQL_ASSOC);
    if (sizeof($data) > 0) {
        $_SESSION['vuser'] = $_POST['vuser'];
        header('Location: /');
        die;
    }
}

衡量数据大小的原因是什么?这是一种糟糕的验证方式。

改为这样做:

if ($query) {
    if(mysql_num_rows($query)>0){
        // In the above line, we check a user with that username and password exists
        $_SESSION['vuser'] == $_POST['vuser'];
        header('Location: /');
     } else echo "Bad password";
} else echo "Connection error";

作为旁注,请立即或很快停止使用 mysql_* 函数。它们将在下一版本的 PHP 中被删除,并且安全性较低。您可以使用 PHP PDO 类。

我还假设您没有将 $username 和 $pass 直接存储在数据库中。如果是,请立即停止,并使用哈希函数来存储密码。您可以使用 md5 和/或 sha1 哈希方法。

于 2013-10-04T20:35:43.053 回答
0
    $sql = ("select * from website where `Email`='$user' and `Password`='$pass'");
    $query = mysql_query($sql);
    $row = mysql_fetch_array($query, MYSQL_ASSOC);
    if ($row) {

            $_SESSION['vuser'] = $_POST['vuser'];
            header('Location:"go where ever you want to i dont care"');

        }
   else{ //some error message}
于 2013-10-04T20:41:48.197 回答