1

単純なログイン資格情報チェッカー(セッション変数を使用)を作成しようとしています。

これは私がこれまでに持っているものです:

<?php
include("dbconnect.php");
$u_name = mysql_real_escape_string($_POST['uname']);
$p_word = mysql_real_escape_string($_POST['pword']);
# *** querying all records ***
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users");
while($rst = mysql_fetch_array($query)) {

//echo $rst[valid_username] . ", ";
//echo $u_name . " || ";
//echo ($rst[valid_username] == $u_name) . " || ";
//echo $rst[valid_password] . ", ";
//echo $p_word . " || ";
//echo ($rst[valid_password] == $p_word) . " || ";
//echo (($rst[valid_username] == $u_name) AND ($rst[valid_password] == $p_word));
//echo "<br/>";

if (($rst[valid_username] == $u_name) AND ($rst[valid_password] == $p_word)) {
    session_start();
    $_SESSION['login'] = "1";
    header('Location: main.php') ;
} else {
    session_start();
    $_SESSION['login'] = '';
    header('Location: badlogin.php') ;
}


}

?>

ここに問題があります:MySQLテーブルのリストに複数のユーザーが含まれている場合、チェックが壊れます。テーブルに最後に入力されたユーザーのみがアクセスを許可されます。最後に入力したユーザーより上のユーザーは、資格情報が正しい場合でも、誤ったログイン画面にぶつかります。なぜこうなった?誰かがこのログインチェックを実装するためのコード修正またはより良いコードを提案できますか?

編集:コメントコードは、提供された資格情報が記録されている資格情報と一致するかどうかを確認するためにテストします。スクリプトのその部分は正常に機能します。

問題が解決しました!皆さん、ありがとうございました。これを将来目にする人は、パスワードを確実に暗号化してください。これはローカルテストアプリケーションであり、ネットへのアップロードも表示されないため、私のものはプレーンテキストです。

4

5 に答える 5

4

すべてのユーザーレコードをループする必要はありません。1000000ユーザーのデータベースがある場合、指定されたユーザー名とパスワードに対応するレコードをフェッチするだけで済みます。クエリを次のように更新します。

$query = mysql_query("SELECT * FROM notes_users 
                      WHERE 
                      valid_password = '$p_word' && 
                      valid_username = '$u_name'");

次に、次のようなことを行います。

if (($row = mysql_fetch_array($query)) {
   // valid user
} else {
   // invalid password or username
}
于 2012-04-22T02:44:56.697 に答える
1

まず、パスワードをプレーンテキスト形式で保存しないでください。代わりにmd5/sha1ハッシュを使用してください。

次に、データベース内のすべてのユーザーのリストを取得することはお勧めできません。SQLクエリのWHERE句-これで問題も解決します。

于 2012-04-22T02:45:40.147 に答える
0

特定のユーザーのログインの詳細を確認する必要があります。

$query = mysql_query("SELECT valid_username, valid_password FROM notes_users WHERE valid_password = '$p_word' && valid_username = '$u_name' ");

これは、チェックされる唯一の行を返します。

于 2012-04-22T02:47:27.230 に答える
0

ユーザーの資格情報を直接照会しないのはなぜですか? 例えば:

$statement = mysql_query("SELECT valid_username FROM notes_users WHERE \
valid_username = '{$u_name}' and valid_password = '{$p_word}' LIMIT 1;");

if ( mysql_num_rows($statement) > 0 ) { /* log user in */ }
else { /* bad log in */

ああ、なぜ文字列比較に === 演算子を使用しないのですか? それを調べてください、それはより実用的です。

于 2012-04-22T02:47:31.193 に答える
0

これは悪いコードです。

$query = mysql_query("SELECT valid_username, valid_password FROM notes_users");

以下のコードを使用します。

$postedUsername=mysql_real_escape_string($_POST['uname']));
$postedPass=mysql_real_escape_string($_POST['pass']));
$query = mysql_query("SELECT valid_username, valid_password FROM notes_users where username='$postedUsername' and password='$postedPass'");
于 2012-04-22T02:47:51.323 に答える