0

これは私のコードです

$username = $_POST['user'];
$password = $_POST['pass'];

if (isset($_POST['user'])); {
    $db = mysqli_connect('localhost', 'root', '', 'db');
    if($query = mysqli_query($db, "SELECT `pass` FROM `accounts` WHERE `user` = '$username'")){
      while($row = mysqli_fetch_assoc($query)){
        $row['pass'] = $setpassword;
      }
      mysqli_free_result($query);
    }
}

現在、フォームから、ユーザーが入力したユーザー名とパスワードを取得し、そのユーザー名を取得してそのユーザー名の行を見つけ、その行からパスワードを取得して、変数$setpasswordとして設定します。以下は、パスワードがデータベース上の指定されたユーザー名と一致するかどうかを確認するためのコードです。

if ($password=='') {
    $verify = 0;
}

if ($password!='') {
    if ($password!=$setpassword) {
        $verify = 1;
    }
    if ($password==$setpassword) {
        $verify = 2;
    }
}

確認が...0の場合-何も入力されていないため、ログインフォームが表示されます。1-間違ったパスワードがログインフォームと一緒に表示されます。2-正しいパスワードが表示され、ユーザー名がセッション変数に割り当てられます。

ユーザーが存在しないユーザー名と、データベースにあるかどうかに関係なくパスワードを入力でき、検証されるという問題があります。

ユーザー名がデータベースに存在しないかどうかを確認するにはどうすればよいですか?

4

3 に答える 3

2

ユーザーの登録を受け入れる場合は、データベースにクエリを実行して、データベースがすでに存在するかどうかを確認します。

$result = mysqli_query("SELECT * FROM accounts where `user` = $username");

if(mysql_num_rows($result) >0) // if there are any rows returned then the username exists
{ 
    //User Name already exists
}
else
{
   //User name doesn't exist, add user
}

これがあなたがそれをしている場所かどうかはわかりません。しかし、重複を排除するために、そのようにすることができます。また、列ユーザーを一意として定義することもできます。そうすれば、SQLは重複する値を許可しません。

また、この行:

$row['pass'] = $setpassword; //setting $row['pass'] to $setpasswords value.

これは逆になります。あなたはそれを逆にするべきです。

 $setpassword = $row['pass']; //setting setpassword to $row['pass'] value.

何か明確にする必要がある場合はお知らせください。

于 2012-01-06T22:53:54.373 に答える
0
if (isset($_POST['user'])); { 

この行には余分なセミコロンがあり、コード全体が機能しません

検証を行うために必要なのは、パスワードを取得して、入力したパスワードと比較することだけです。

$row = mysqli_fetch_assoc($query));
if ($row AND $row['pass'] == $password)
  $verify = 1;
}

$row は空の可能性があることに注意してください。そのため、最初に確認する必要があります

ただし、次のように、クエリで両方の比較を行うことができます

"SELECT * FROM accounts where `user` = $username" AND `pass` = '$password';

ただし、コードには 2 つの一般的な問題があります。

  1. プレーンなパスワードの代わりにハッシュを保存することをお勧めします。

  2. クエリにデータを追加する前に、データをサニタイズする必要があります

少なくともこの方法:

$username = mysqli_real_escape_string($db,$_POST['user']);
于 2012-01-06T23:15:34.253 に答える
0

これを試して:

$username = isset($_POST['user'])?$_POST['user']:''; // check if isset to avoid notice
$password = isset($_POST['pass'])?$_POST['pass']:'';
$verify = 0; 

if (!empty($username)) {
    $db = mysqli_connect('localhost', 'root', '', 'db');
    if($query = mysqli_query($db, "SELECT `pass` FROM `accounts` WHERE `user` = '$username'")) { 
    while($row = mysqli_fetch_assoc($query)){
       $setpassword = $row['pass'];
       break; // exit the loop once you found the password
    }
    mysqli_free_result($query);    
} 

if (isset($setpassword)) {
   $verify = 1;       
   if ($password == $setpassword) {
      $verify = 2;
   }
}
于 2012-01-06T23:09:18.350 に答える