0

私は単に何かを見落としていると確信しています、そして私はこれに取り組んで数日を費やしました、そしてそれを理解することができないようです。

前のページにログインした後、ユーザー名とパスワードを取得します。

$username = mysql_escape_string($_POST['adminusername']);
$password = mysql_escape_string($_POST['adminpassword']);

次に、データベースにアクセスして、データベースからユーザー名とパスワードを取得します。

$sql = "SELECT username, password FROM `weaponsadmin`";
$rows = $db->query($sql); while ($record = $db->fetch_array($rows)) {

今ここに私を混乱させている部分があります、私が以下を持っているならば、私がユーザー名またはパスワードに何を使用しても、それは私がログインすることを許可しません、

if ( ($record[username]==$username) && ($record[password]==$adminpassword) ){
   $_SESSION['loggedin'] = true;
   $_SESSION['username'] = $adminusername;
   header( "Location: admin.php" ) ;
}
else {
   header( "Location: index.php?login=error" ) ;
}

ただし、以下を使用すると、ユーザー名が正しければログインできますが、パスワードは何でも入力でき、機能します。

$adminusername = $record[username]; 
$adminpassword = $record[password];

if ( ($adminusername==$username) && ($adminpassword==$adminpassword) ) {
   $_SESSION['loggedin'] = true;
   $_SESSION['username'] = $adminusername;
   header( "Location: admin.php" ) ;
}
else {
   header( "Location: index.php?login=error" ) ;
}

要約すると、何らかの理由で&&パーツが正しく機能していないようです。誰かがコードを手伝ってくれて、セキュリティを向上させるためにコードを改善できる場所と、これを正しく機能させる方法を教えてくれたら、ありがとうございます。

4

6 に答える 6

3

ここでのポイントは何ですか$adminpassword==$adminpassword

私はそれがすべきだと思います:

if ( ($adminusername==$username) && ($adminpassword==$password) ){
于 2012-06-15T19:42:05.917 に答える
1

$record[username]する必要があります$record["username"](など)。インデックスは文字列またはintです

于 2012-06-15T19:41:50.513 に答える
1

配列を間違って使用しています。
あなたが期待すること:$record[username]; //retrieve contains of key "username"
実際に何が起こるか:

    $record[username]; 
    /* 
         retrieves a key in the record array under the key which is a value of a
         constant named "username" (if it's defined) and an empty string with 
         E_WARNING if it's not. 
    */



たとえば、インデックス名を一重引用符または二重引用符で囲む必要があります$records['username']。ただし、文字列内で引用符で囲まれていない配列インデックスを使用できます(これらは期待どおりに機能します)-> $someString = "Blahblahblah, ergo $record[username] is a donkey.";

于 2012-06-15T19:57:13.640 に答える
0

===の代わりに使用できます==これを読んでください。
ここではstrcmp()は必要ありません。

于 2012-06-15T19:54:30.163 に答える
0

Michaelの答えに加えて、文字列の比較に==を使用しない理由(これが将来同様の問題を解決するのに役立つことを願っています)は、オブジェクト(文字列など)で単純な==を呼び出すときです。実際には、ほとんどの言語でint、double、float、char、long、short、またはboolean以外のもの)、実際に比較しているのは、各オブジェクトのメモリ内のアドレス、つまりポインタ値です。

これは、2つの変数が同じオブジェクトを参照しているかどうかを知りたい場合に役立ちますが、2つのオブジェクトが同一であるかどうかを知りたい場合はあまり役に立ちません。だからこれは本当です:

$string_a = $some_string;
$string_b = $some_string;
$string_a == $string_b;

しかし、これはそうではありません:

$string_a = getUserInput();  # user types in "hello"
$string_b = getUserInput();  # user types in "hello"
$string_a == $string_b;

これは、使用している言語によっては、文字列リテラルがアタッチされているユーザー定義変数とは関係なく、文字列リテラルをメモリに格納している場合に当てはまる可能性があります。

$string_a = "hello";
$string_b = "hello";
$string_a = $string_b;

したがって、2つのオブジェクトが実際に同じオブジェクトであり、単に同一ではないかどうかを確認する場合を除いて、前に提案したように、2つを比較する関数を使用してください。このような関数は通常、プリミティブ型のレベルまで下がります。これは、予想どおり==を使用して比較でき、すべての比較が行われる場合はtrueを返します。

于 2012-06-15T19:55:44.973 に答える
-1

==文字列の比較には使用しないでください。代わりに、strcmp()またはを使用===して文字列を照合します。

于 2012-06-15T19:45:23.890 に答える