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、ユーザー名とパスワードはデータベース内の 1 つのエントリにしか一致しないため、ステートメントはユーザー名とパスワードの入力に関係なく実行されます。

ループを削除して、次の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 . "'");

行数が1に等しいかどうかを確認します。

于 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() を実行するか、1 行をフェッチして正しく返されるかどうかを確認することで、ユーザー名とパスワードが一致するかどうかを簡単に確認できます (一致しない場合は、ユーザー名またはパスワードが間違っています)。

于 2013-10-07T21:48:10.200 に答える