0

シンプルなユーザー名/パスワードのログイン スキームを使用する小さな 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() を使用するだけに変更しましたが、同じ最終結果が得られます.フォームにパスワードを入力するだけで得られるものとは異なるハッシュになります.

ページのエンコーディングに、コピー/貼り付けテキストを入力したものとは異なるものにするものはありますか?

4

1 に答える 1

3

問題は、ユーザーがユーザー名/パスワードを貼り付けるときに、その前後にスペースが含まれることが多いことです。これらのフィールドを実行してtrim()、これを修正します。

別の注意として、あなたが持っているものはそれほど安全ではありません. あなたのbase64文字列は長い間だまされることはありません.md5は、特にソルトされていない場合は、パスワードハッシュに使用しないでください. ワールプールなど、もう少し堅牢なものを試してください。最後に、インジェクションの問題を回避するために、PDO で準備されたクエリを使用することをお勧めします。現在、データをエスケープしています...それは素晴らしいことです! しかし、どこかで逃げ場を逃してチャンスを逃さないのが一番です。

于 2012-08-12T09:19:02.073 に答える