2

機能している単純な認証スクリプトがありますが、パスワード admin を持つユーザー admin の場合、パスワード ADMIN を持つユーザー ADMIN もログインできることがわかりました。このスクリプトで大文字と小文字を区別するにはどうすればよいですか。また、パスワードがテキストとして保存されないようにすることができる暗号化を認識しています。この大文字と小文字を区別する方法を理解する必要があります。

        if($_SERVER['REQUEST_METHOD'] == "POST" &&  mysql_real_escape_string($_POST['username'])!="" && mysql_real_escape_string($_POST['password']) !="") { // receive form sent via POST method

        $username = mysql_real_escape_string($_POST['username']); // prevent sql injection by using  "mysql_real_escape_string()"
        $password = mysql_real_escape_string($_POST['password']);
        $data = mysql_query("SELECT * FROM users WHERE username='$username' AND password='$password'");

    if(mysql_num_rows($data) >0) {   // if the query returns a result then create session variables to show user is authenticated
      $_SESSION['logged'] = 1;
      $_SESSION['user'] = $username;
    }
  }
4

9 に答える 9

8

BINARY タイプを使用して、大文字と小文字の区別を強制できます。

"SELECT * FROM users WHERE BINARY username='$username' AND password='$password'"

mysql_ 関数は非推奨であることに注意してください。mysqli または PDO に切り替えて、準備済みステートメントを使用する必要があります。

于 2013-05-24T02:50:25.580 に答える
2

まず、パスワードをハッシュ化する必要があります。大文字と小文字を変更すると、別のハッシュが得られるため、問題が分類されます。

大文字と小文字を区別してユーザー名を比較したい場合は、おそらくそのように保存し、ログイン 'foo' と 'Foo' に対して異なるユーザーを作成できるようにしたいでしょう。これは可能ですが、データベース テーブルを変更する必要があります。具体的には、ユーザー名列の列タイプを変更して、文字セットと照合順序を含める必要があります。

ALTER TABLE users MODIFY COLUMN username VARCHAR(64) CHARACTER SET 'latin1' COLLATION 'latin1_general_cs';
于 2013-05-24T05:38:23.427 に答える
2

パスワードフィールドの照合を、「ci」ではなく「cs」が末尾にある値に設定する必要があります

「latin1_swedish_ci」の代わりに「latin1_swedish_cs」

ci は大文字と小文字を区別しないことを示し、cs は大文字と小文字を区別することを示します

于 2013-05-24T06:00:41.797 に答える
1

そうしない理由がない限り、パスワードをハッシュします (SHA-256 が優先されますが、MD5 は引き続き受け入れられると思います)。ハッシュは、トラフィックを渡すときにセキュリティのレイヤーを生成します。これは、それらを復号化するには力ずくで行う必要があるためです。また、大文字の A と小文字の a を異なるハッシュとして保存するため、大文字と小文字の区別の問題も処理されます。

そうでない場合は、パスワード フィールドで大文字と小文字を区別する関連付けを使用する必要があります。

于 2013-05-24T02:50:26.640 に答える
0

大文字と小文字が区別される PHP を使用したクエリによって返されるユーザー名とパスワードを比較します。

if(mysql_num_rows($data) >0) {   // if the query returns a result then create session variables to show user is authenticated
  $row = mysql_fetch_assoc($data);
  if ($row['username'] == $_POST['username'] && $row['password'] == $_POST['password']) {
    $_SESSION['logged'] = 1;
    $_SESSION['user'] = $username;
  }
}
于 2013-05-24T03:43:36.940 に答える
0

latin1_general_csデータベースに登録されているユーザー名とパスワードのコレクションを変更するだけです。

于 2014-04-25T03:51:28.303 に答える
0
<?php
// user input

$username="abc";
$password="123";

$sql=SELECT username,password FROM tablename WHERE username='".$username."' AND password ='".$password."' limit 1
$result=mysqli_query($coni,$sql);
if(!mysqli_num_rows($result) == 1)
{
    echo "not found";
}
else
{
    while ($row=mysqli_fetch_array($result)) 
    { 
        $getu=$row[0];
        $getp=$row[1];
    }
    if($username===$getu && $password===$getp)
    {
        echo "username".$getu." password".$getp;
        echo "Login success";
    }
    else
    {
        echo "no";
    }
}
?>
于 2016-07-23T06:26:23.350 に答える