シンプルなユーザー名/パスワードのログイン スキームを使用する小さな Web アプリがあります。ユーザーがパスワードを正しく入力してもログインできないことが何度かありました。
コードは当初、初期登録時にユーザーが入力したパスワードを次のように暗号化していました。
function encode5t($str) {
for($i=0; $i<5;$i++) {
$str=strrev(base64_encode($str)); //apply base64 first and then reverse the string
}
return $str;
}
$password=mysql_real_escape_string($_POST['password']);
$pass=encode5t($password);
次に、$pass が MySQL データベースに挿入されます。次に、ログイン時にパスワードを暗号化するために同じ関数が使用され、次のようにデータベースに対してチェックされます。
$username = $_POST['username'];
$psw = $_POST['password'];
$npsw=encode5t($psw);
$query = sprintf("SELECT * FROM members WHERE username='%s' AND password='%s'",
mysql_real_escape_string($username),
mysql_real_escape_string($npsw));
フォームへのパスワードの入力方法によっては、問題が発生します。単純に入力した場合は問題ありませんが、パスワードをコピーしてフォームに貼り付けた場合 (新しく生成されたパスワードを含む電子メールからのように)、失敗します。暗号化機能はまったく異なるハッシュを作成し、一致しないため、ユーザーはログインしていません。
エンコーディングをいじって、 md5() を使用するだけに変更しましたが、同じ最終結果が得られます.フォームにパスワードを入力するだけで得られるものとは異なるハッシュになります.
ページのエンコーディングに、コピー/貼り付けテキストを入力したものとは異なるものにするものはありますか?