1

ログインフォームを介して渡されたユーザー名とパスワードを一致させ、セッションを作成し、セッション変数を通過させ、ユーザーを別のページにリダイレクトしようとするログインスクリプトを作成しました。

私は OOP PDO アプローチ スタイルを使用しています。

ユーザーを登録するとき、PHP crypt メソッドを使用してパスワードを暗号化します。ただし、ログインしようとすると、ステートメントが false として返されます。公平を期すために、何が間違っているのかわかりません。おそらく、パスワードを間違って解読しているのかもしれませんが、わかりません。

false と言うときは、if ステートメントのエコーを意味します

Invaild username or password. Try again

ヘルプやアイデアは大歓迎です。よろしくお願いします。

index.php

<form id="loginForm" method="POST" action="classes/class.Login.php">
<input type="text" id="username" name="username" placeholder="Username"/>
<input type="password" id="password" name="password" placeholder="Password" class="showpassword"/> 
<input type="submit" name="submit" value="Log in"/>

クラス/class.Login.php

public function loginuser() {

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

 $stmt = $this->pdo->prepare("SELECT * FROM users WHERE username = :username AND password = :password LIMIT 1");
 $stmt->bindValue(":username", $username);
 $stmt->bindValue(":password", crypt($password));
 $stmt->execute();
 if ($stmt->fetch())
 {
    $_SESSION['authorized'] = true;
    $_SESSION['username'] = $username;
    header("Location: testloginrequired.php");
  }
  else
  {
    echo "Invaild username or password. Try again";
   }
}// end loginuser
4

3 に答える 3

3

@Nambi が示唆したように、crypt()を使用する場合は、オプションのパラメーター Salt を使用する必要があります。そうしないと、異なる結果が返されるため、一致することはありません。

echo crypt('foo');
echo crypt('foo');
echo crypt('foo');

戻り値:

$1$rnmZxKr0$V7lk8JZ0tV1Utb78hH0g.0
$1$v84YR6KA$Xl5QvouObIZqWvxEIQwO/.
$1$expSZHgb$HAZ9ydKmjQcmwLeLDxjO41


echo crypt('foo', 'bar');
echo crypt('foo', 'bar');
echo crypt('foo', 'bar');

戻り値:

ba4TuD1iozTxw
ba4TuD1iozTxw
ba4TuD1iozTxw


明らかに、単純な塩を使用する代わりに塩を覆い隠すか、さらに制御したい場合は自動生成させるとよいでしょう。

ユーザーを登録するときは、生成されたソルトを保存する必要があります。
ログインを確認するときは、ソルトを取得し、それをユーザー入力パスワードと一緒に使用して crypt() し、そのソルトで暗号化されたパスワードがデータベース内のパスワードと一致するかどうかを確認します。

: セキュリティのために、それは明らかですが、念のため: パスワードごとに異なるソルトを生成します。同じソルトを使用する場合、1 つのパスワードがハッキングされた場合、ハッカーは他のすべてのパスワードのソルトを知ることができ、生活が楽になります。


そして、@Nabilが提案したように、使用する暗号化を少し調査することをお勧めします。後でそれを変更するのは苦痛になるからです。

個人的にはふぐが好きです

MD5 と SHA1 は避けてください。かつては安全と見なされていましたが、テクノロジーが進化したため、もはや安全ではありません。php ドキュメントの各ページで、ユーザーは新しいユーザーにそれらを使用しないように警告しています。

于 2013-09-24T08:56:08.183 に答える
2

これはcrypt('something')、毎回異なる値を返すためです。

ripemdを利用する

<?php
echo hash('ripemd160', 'password');
?>
于 2013-09-24T08:41:58.070 に答える
-2

mysql データベースに保存する場合は、crypt() の代わりに sha1() を試してください。

于 2013-09-24T08:44:18.410 に答える