0

我意识到这个问题之前已经得到了回答,但是每个问题都特定于每个人的代码。如果有人能告诉我为什么 if 和 else 语句都在执行,我将不胜感激。该脚本是我正在开发的一个论坛软件的登录脚本的一部分。谢谢罗比

<?php
$username = $_POST['username'];
$password = md5($_POST['password']);
session_start();
include($_SERVER['DOCUMENT_ROOT']."/forum/config.php");

$connect = mysqli_connect($DBHOST,$DBUSER,$DBPASS,$DBNAME);
if ($connect->connect_errno) {
    die('Connection Error: ' . $connect->connect_errno);
}
$query = $connect->query("SELECT * FROM forum_users");
while($row = $query->fetch_array()){
  if (($row['username'] == $username) AND ($row['password'] == $password)) {
        $_SESSION['username']=$username;
        echo '<script language="javascript">';
        echo 'window.location.href = "../forum/"';
        echo '</script>';
  } else {
        echo '<script language="javascript">';
        echo 'window.location.href = "../forum/login?password=wrong"';
        echo '</script>';
  }
}
?>
4

2 回答 2

1

您正在从数据库 ( SELECT * FROM forum_users) 中获取所有用户数据。如果您有多个具有不同名称或密码的用户,则该else语句将独立于用户名和密码输入执行,因为用户名和密码只能匹配数据库中的一个条目。

您应该删除while循环并将其替换为

$row = $query->fetch_array();
if ($row) {
    if (($row['username'] == $username) AND ($row['password'] == $password)) {
        $_SESSION['username']=$username;
        echo '<script language="javascript">';
        echo 'window.location.href = "../forum/"';
        echo '</script>';
    } else {
        echo '<script language="javascript">';
        echo 'window.location.href = "../forum/login?password=wrong"';
        echo '</script>';
    }
}

编辑

您还可以在查询中执行整个密码检查

$secureUsername = mysql_real_escape_string($username);
$securePassword = mysql_real_escape_string($password);
$query = $connect->query("SELECT * FROM forum_users WHERE username='" . $secureUsername . "' AND password='" . $securePassword . "'");

然后检查行数是否等于一。

于 2013-10-07T21:44:35.393 回答
0

--edit-- 在上面的 Simon 的帖子中涵盖了在查询中包含用户名和密码

...然后只运行一次:

$row = $query->fetch_array();
if ($row) {
    $_SESSION['username']=$username;
    echo '<script language="javascript">';
    echo 'window.location.href = "../forum/"';
    echo '</script>';
} else {
    echo '<script language="javascript">';
    echo 'window.location.href = "../forum/login?password=wrong"';
    echo '</script>';
}

当您将凭据放入查询中时,您可以通过执行 $query 的 count() 或获取一行并查看它是否正确返回(如果没有,用户名)轻松找出用户名和密码是否匹配或密码错误)。

于 2013-10-07T21:48:10.200 回答