0

HTML5 を使用して Web ベースのアプリケーションを作成しています。これは mySQL データベースに接続されています。PHPを使用して2つを接続しようとしています。

番号とパスワードをデータベース内の番号と照合して有効なログインかどうかを確認するログイン ページを作成しようとしています。番号とパスワードのハードコーディングは正常に機能しますが、それをデータベースに適用しようとすると、ログイン資格情報が無効であっても常に「ログインしました」というメッセージが表示されます。$_POST と $dbRow の両方を使用してみましたが、役に立ちませんでした。

<?php

session_start();

$s_number = $_POST["snumber"];
$s_pass = $_POST["passwd"];

//$s_number = "12345";
//$s_pass = "qwerty";
//$s_permission = "manager";

include ("dbConnect.php");

$dbQuery = "SELECT * FROM staff_details WHERE staff_number='$s_number' AND password='$s_pass'";
$dbResult = mysql_query($dbQuery);
$dbRow=mysql_fetch_array($dbResult);

if ($_POST["snumber"]==$s_number) {
    if ($_POST["passwd"]==$s_pass) {
        echo "<p>Logged in!</p>";
    } else {
        echo "<p>Wrong Password</p>";
    }
}

else echo "<p>Bad username and password</p>";

/*if ($dbRow["username"]==$s_number) {       
     if ($dbRow["password"]==$s_pass) {
        echo "<p>Logged in!</p>";
     }
     else {
        echo "<p>Wrong Password</p>";
     }
  } else {
        echo "<p>Bad username and password</p>";
  }*/

?>

私はPHPが初めてです。他の例を検索しましたが、これを行うにはさまざまな方法があり、理解できないようです。どんな助けでも大歓迎です!

4

3 に答える 3

0

これを試して:

<?php


include ("dbConnect.php");

if(isset($_POST["snumber"]))
{
  $s_number = mysql_real_escape_string($_POST["snumber"]);
  $s_pass = mysql_real_escape_string($_POST["passwd"]);
  $dbQuery = "SELECT * FROM staff_details WHERE staff_number='$s_number' AND password='$s_pass'";
  $dbResult = mysql_query($dbQuery);
  $dbRow=mysql_fetch_assoc($dbResult);

  if ($dbRow["staff_number"]==$s_number && $dbRow["password"]==$s_pass) {       

        echo "<p>Logged in!</p>";
     }
     else {
        echo "<p>Wrong Password</p>";
     }
  }
   else {
        echo "<p>Bad username and password</p>";
  }



?>

PS: mysqli または PDO を使用してください ;) ; count または mysql_num_rows を試して、一致結果がゼロかどうかを確認できます。

サルドス。

于 2013-03-29T21:53:31.583 に答える
0

Adrian と Robert は問題の一部に対処しました。

PHP を学んでいるだけなら、非推奨の mysql_ 関数ではなく、mysqli API を使用するようにコードを書き始める必要があります。それらはほとんど同じですが、後者は将来のある時点でなくなります。

ログインページを作成している場合、おそらくセキュリティが心配です-ただし、コードを適切にエスケープしないと、制御メカニズムをバイパスするのは簡単です(場合によっては、データベースを重大な破壊行為/開示の問題にさらします).

さらに、SQL インジェクションの問題を修正しても、セッション固定を使用して認証を簡単に通過できます。

次の間違いは、データベースとの対話が成功したかどうかを確認しないことです。

したがって、これはこの質問の複製のように見えますが、その投稿に関する回答/議論の質が悪いため、そのようにフラグを立てていません。

さらに、データベースからユーザー名/パスワードに一致する行のみを選択したのに、なぜユーザー名とパスワードを取得したデータと比較するのでしょうか?

認証の詳細が提供されたときにログインが失敗した理由を説明しないことは、一般的に優れたセキュリティ プラクティスと見なされます。

ということで再挑戦…。

<?php

session_start();
include ("dbConnect.php");

function auth($user, $pass)
{
   $user=mysqli_real_escape_string($user);
   $pass=mysqli_real_escape_string($pass);
   $qry="SELECT SUM(1) AS matches 
 FROM YOURDB.staff_details 
 WHERE staff_number='$user' 
 AND password='$pass'";
   $res=mysqli_query($qry) || die "Sorry - not available";
   $r=mysql_fetch_assoc($res);
   return $r['matches'];
}
if (auth($_POST["snumber"], $_POST["passwd"])) {
      session_regenerate_id();
      echo "<p>Logged in!</p>";
} else {
      echo "<p>Sorry - invalid authentication</p>";
}
于 2013-03-29T22:15:26.910 に答える
-1

$_POST の代わりに $dbRow を使用する必要があります。現在、$_POST と $_POST を比較しているだけです。

いつも同じになります。

次に、クエリと配列キーで異なるフィールド名を指定しました。

これを試して。

<?php

session_start();

$s_number = $_POST["snumber"];
$s_pass = $_POST["passwd"];

//$s_number = "12345";
//$s_pass = "qwerty";
//$s_permission = "manager";

include ("dbConnect.php");

$dbQuery = "SELECT * FROM staff_details WHERE staff_number='$s_number' AND password='$s_pass'";
$dbResult = mysql_query($dbQuery);
$dbRow=mysql_fetch_array($dbResult);

if ($_POST["snumber"]==$dbRow['staff_number']) {
    if ($_POST["passwd"]==$dbRow['password']) {
        echo "<p>Logged in!</p>";
    } else {
        echo "<p>Wrong Password</p>";
    }
}

else echo "<p>Bad username and password</p>";

/*if ($dbRow["username"]==$s_number) {       
     if ($dbRow["password"]==$s_pass) {
        echo "<p>Logged in!</p>";
     }
     else {
        echo "<p>Wrong Password</p>";
     }
  } else {
        echo "<p>Bad username and password</p>";
  }*/

?>

編集:後でIfステートメントを実行する必要はありませんが。ユーザー名/パスワードが一致する DB クエリの結果を取得している場合、資格情報は正しいです。

だからあなたはできる、

 if (!empty($dbRow)){
            echo "<p>Logged in!</p>";
        } else {
            echo "<p>Wrong Password</p>";
        }
    }
于 2013-03-29T21:45:13.700 に答える