0

以下のような PHP コードがあるとします。

<form action="index.php" method="post" id="myform">
     <tr>
        <td>User Name </td>
        <td><input type="text" name="text_username" placeholder="your username here" class="validate[required]"/></td>
     </tr>
      <tr>
        <td>Pass Word </td>
        <td><input type="password" name="text_password" placeholder="your password here" class="validate[required]" /></td>
     </tr>
     <?php 
            $userPass = array();
            $userName = array();
            $userID = array();
            include ('include/connectdb.php');
            if(isset($_POST['tbn_submit'])){
                $query = mysql_query("SELECT * FROM tblusers");
                $username = $_POST['text_username'];
                $password = $_POST['text_password'];

                 while($value= mysql_fetch_array($query)){ 
                            $userPass = $value['user_password'];
                            $userName = $value['user_username'];
                            $userID = $value['user_id'];
                                if($username == $userName && $password == $userPass){
                                     header("location:DataInfo.php?uid=".$userID);
                                   }
                                 else if($username != $userName && $password == $userPass) {
                                    echo'<tr><td colspan="2"><center><b style="color:red;">Invalide username or password, please check again!   </b></center></td></tr>';             
                                    }
                }
             }      
    ?>
     <tr>
        <td></td>
        <td><input type="submit" name="tbn_submit" class="btn btn-success" value="Login"/><input type="reset" class="btn btn-warning" value="Cancel"/></td>
     </tr>
     </form>

問題点:

間違ったユーザー名とパスワードを使用すると、繰り返しメッセージInvalide username or password, please check again!が何度も表示されるので、このようにしたくありません。これを修正するにはどうすればよいですか。誰か助けてください、ありがとう

4

5 に答える 5

1

これはとても間違っています。まず、

php でパスワードとログインの一致を確認するのはなぜですか? 次のようなクエリを作成できます。

SELECT * FROM tblusers WHERE username = *username* AND password = *password*

クエリが結果を返す場合、ユーザーはログインできます。それ以外の場合はエラー メッセージです。

次に、コードの問題は、すべてのユーザーデータベースをログインとパスワードと比較することです。パス/ログインが一致する場合、ユーザーを別のページにリダイレクトしますが、一致しない場合はエラー メッセージを表示します。問題は、一致しない場合にスクリプトが停止しないことです。

したがって、username / pass が false になるたびに、エラー メッセージが表示され、ユーザー データベースの列ごとに表示されます。

これが機能するようになったら、sha1 を使用することをお勧めします。これにより、パスワードがプレーン テキストで読み取られないようにすることができます ...

でパスワードを保存し、sha1($password)と比較するだけsha1()です。

于 2012-09-26T08:13:02.167 に答える
1

あなたの問題はおそらくあなたのクエリです:

mysql_query("SELECT * FROM tblusers");

テーブルからすべてのユーザーを選択し、それらを繰り返し処理しています。代わりに、ユーザー名で選択してからパスワードを比較します。

mysql_query("SELECT * FROM tblusers WHERE user_username = ".$_POST['text_username']);

おそらく、そのクエリにもパスワードを追加したいと思うでしょう。

もちろん、これはセキュリティ上の問題や問題、およびそうでないものに対して広く開かれているため、代わりに PDO と MySQLi を検討する必要があります。

最後のメモとして、PHP でパスワードを正しい方法で行うことは常に良いことです: How do you use bcrypt for hashing password in PHP?

于 2012-09-26T08:13:23.503 に答える
1

コードでは、既知のすべてのユーザーを照会し、ユーザー名とパスワードが等しい場合はそれぞれをチェックします。これは不必要に遅く、データベースからすべてのユーザーを取得する必要はありません。指定されたユーザー名を持つユーザーを検索するだけです。

パスワードをプレーンテキストでデータベースに保存することはお勧めできません。BCrypt などのハッシュ関数を使用して、ハッシュ化されたパスワードのみをデータベースに保存する必要があります。

次に、mysql_* 関数ではなく、mysqli または PDO に切り替えることをお勧めします。mysql 関数は非推奨です。

于 2012-09-26T08:14:33.710 に答える
1

コードから明らかになっている出力。あなたがしていることは次のとおりです。

  1. ユーザー テーブル (tblusers) からすべてのレコードを取得しています

    mysql_query("SELECT * FROM tblusers");

  2. 次に、各レコードをループしています

    while($value= mysql_fetch_array($query))

したがって、テーブルtblusersに 1000 件のレコードがある場合、メッセージは 1000 回表示されます。

次のように書き換える必要があります。

include ('include/connectdb.php');
if(isset($_POST['tbn_submit'])){
  $username = $_POST['text_username'];
  $password = $_POST['text_password'];
  $query = mysql_query("SELECT * FROM tblusers WHERE username = $userName AND password = $userPass");

  if(mysql_num_rows($query)){
    $user = mysql_fetch_assoc($query)
    header("location:DataInfo.php?uid=".$user['user_id']);
  } else {
    echo '<tr><td colspan="2"><center><b style="color:red;">Invalide username or password, please check again!   </b></center></td></tr>';             
  }
}   

次の問題に注意してください。

  • 変数 $userName と $userPass はここではエスケープされません。コード内でエスケープしてください。ここで見ることができます。そうしないと、危険にさらされる可能性があります。
  • else { }マークアップをブロックで修正する必要があります。
  • 示されているコード/ロジックには、他の改善の可能性があります。私はちょうどあなたにアイデアを与えました!
  • また、データベースに平文のパスワードを保存してはいけません。少なくとも mysql のネイティブ password()関数を使用してください!
于 2012-09-26T08:21:55.643 に答える
0
<html>

<h1 align="center">LOGIN PAGE</h1>
<br>
<?php
if(isset($_POST['submit']))
{
$uname=$_POST['$uname'];
$pname=$_POST['$pname'];
echo $uname;
}
?>
<body>
<form action="nexts.php" method="GET">
<table border=1 align=center>
<tr>
<th>USERNAME<th>
<input type="text" name="uname">
</tr>
<tr>
<th>PASSWORD<th>
<input type="password" name="pname">
<br>
<input type="submit" name="submit" value="submit">
</tr>
</html>`<html>

<h1 align="center">LOGIN PAGE</h1>
<br>
<?php
if(isset($_POST['submit']))
{
$uname=$_POST['$uname'];
$pname=$_POST['$pname'];
echo $uname;
}
?>
<body>
<form action="nexts.php" method="GET">
<table border=1 align=center>
<tr>
<th>USERNAME<th>
<input type="text" name="uname">
</tr>
<tr>
<th>PASSWORD<th>
<input type="password" name="pname">
<br>
<input type="submit" name="submit" value="submit">
</tr>
</html>

------------------------------------------------

nexts.php
----------------------------

<?php
include_once('connections.php');
?>

<?php

if(isset($_GET['submit']))
{

$uname = $_GET['uname'];
$pname = $_GET['pname'];


$query = mysql_query("SELECT * FROM dayz");
while($value= mysql_fetch_array($query))
{ 
$varuname = $value['uname'];
$varpname = $value['pname'];

if($varuname == $uname && $varpname == $pname)
{
echo "login successful";
}
else if($varuname != $uname && $varpname == $pname) 
{
echo "Invalide username or password, please check again!";             
}
}
}     

?>
于 2014-06-22T11:12:37.813 に答える