0

正しいユーザー名/パスの組み合わせを入力しても、この単純なPHP / MySQLログインコードに常に「間違ったユーザー名またはパスワード」が表示される理由を誰かに教えてもらえますか?私はこれを理解しようと多くの時間を費やしてきました。

<?php
// Database Connection
mysql_connect("IP", "charlesfries", "Password") or die(mysql_error());
mysql_select_db("charlesfriessdatabase") or die(mysql_error());

// Variables
$username = $_POST["username"]; 
$password = $_POST["password"];

$result = mysql_query("SELECT * FROM accounts WHERE username = '$username' and password = '$password'");

// Success
$count = mysql_num_rows($result);
if ($count == 1) // Checks for Single Record of Given Username & Password
{
    session_register("username"); // Registers Username Key in Session
    session_register("password"); // Registers Password Key in Session
    header("location:http://charliefries.tk/");
}

// Failure
else
{
    echo "Wrong Username or Password";
}
?>

また、私のコードが注入可能であると言わないでください。私はそれを知っています。

これが私のフォームコードです:

<form action="signinprocess.php" method="post"> <!-- Sign In Process -->
Username: <input type="text" name="username" style="width:150">
<br />
Password: <input type="password" name="password" style="width:153">
<br />
<br />
<input type="submit" value="Sign In">
</form>
4

2 に答える 2

4

SELECTでLIMIT1を試して、行が1つしかないことを確認してください。

于 2013-03-02T03:35:45.257 に答える
1

コードにはいくつかの「悪い考え」があります。

  1. 新しいプロジェクトにはmysql_*を使用しないでください。これは時代遅れです。mysqli_*に切り替えますhttp://php.net/manual/en/book.mysqli.php
  2. ユーザー名とパスワードで選択することは必ずしも良い考えではありません。ほとんどの場合、ユーザー名を検索して、パスワードが正しいかどうかを確認することをお勧めします。プリペアドステートメントを使用すると、次のようなものが得られます

    SELECT * FROM accountsWHERE username=?

    次のステップでは、パスワードがデータベースと同じであるかどうかを確認できます。たとえば、ifステートメント$ _POST ['password'] == $dataFromDB['password']を使用します。

  3. 現在、パスワードをプレーンテキストで保存しています。これは本当に悪い考えです。bcryptを見てください。PHPでパスワードをハッシュするためにbcryptをどのように使用しますか?を参照してください。
  4. session_registerが古くなっています。次のようなものを使用します

    $ _SESSION ['username'] = $ dataFromDB ['username']

私が見るように、問題は(存在しない)LIMITにあります。これらのヒントがとにかくあなたを助けることを願っています。

于 2013-03-02T03:41:02.680 に答える