[PHP-users 18234]Re: PHPLIBのログインフォームを外部に持ちたい

Masato Tanaka php @ e-linez.com
2003年 10月 3日 (金) 15:19:41 JST


お世話になっております。田中です。

なるほど、よくわかる説明ありがとうございます。
なんだろうと思っていた、チャレンジ文字列がよく理解できました。

調べてみたところ、ログインフォームから「response」を送信していなかったこと
が判明しました。このため、JavaScritがOFFになっているときのためのコードを通過
して
いました。いままで、パスワードが暗号化されていなかったということですね
(泣)。

外部フォームからログインしようとしたときは、以下のif分でfalseが返されてしま
い
ログインできないことがわかりました。
-- (auth_validateloginの一部)------
if (md5($password) != $pass) {
        return false;
------------------------------
$passwordを出力してみると、なぜか空でそのあたりに原因があるのかもしれないと
思っています。POSTの受け渡し自体がうまくいってないのかと思ったのですが、
一度、loginform.ihtmlを表示するプロセスを通ると、このif分は通過せず、正常に
uidを
返してくれるので、別に問題があるのでしょうか。

また、話が戻ってしまいましたが、簡単にでもアドバイスいただけると嬉しいです。

田中


> 田中さんのコードでは、チャレンジ・レスポンス型の認証方式を利用されているの
で、
> 外部からの直接ログインができないんですね。
>
> 外部フォームからではなく、普通に認証の必要なページにアクセスした場合、
> loginform.ihtmlが表示されるわけですが、
> そのとき、同時にチャレンジ文字列をサーバ側で生成し、
> ログインフォームの中にhiddenタグとして埋め込み、
> さらにサーバ側でもそのチャレンジ文字列を保存します。
>
> ユーザがブラウザ上でユーザ名とパスワードを送信するときに、
> JavaScriptでユーザ名、パスワード、チャレンジの連結文字列を
> MD5でハッシュ化し「response」としてサーバに送りつけます。
> つまり、生パスワードをネット上に流さないようにするための配慮です。
>
> サーバ側では、送信されてきたユーザ名を手がかりに
> データベースからパスワードを取得し、先ほど保存しておいたチャレンジ文字列と
> ユーザ名を同様に連結してMD5でハッシュ化します。
>
> このハッシュ化された文字列同士を比較して認証のチェックを行います。
>
> これを外部のフォームから行おうとすると、
> 最初のアクセスがないために、サーバ側でチャレンジ文字列が生成されません。
> なので、ハッシュ後の文字列が当然のことながら異なるものになってしまいます。
> これでは、いくらがんばっても認証は通りません。
>
> 幸い、田中さんのauth_validatelogin()内には、
> ユーザのブラウザでJavaScriptがOffになっているときのための
> 対処コードも含まれています。
> 「response」が空だったときの処理がそうです。
>
> 多分、外部フォームの方にもloginform.ihtmlと同様に
> JavaScriptのコードが含まれていると思いますが、
> それを取り除き、responseのhiddenタグもなくしたほうがいいでしょう。
>
> ただし、せっかくのセキュリティ対策は損なわれます。
> 外部フォームからのログインの場合は、
> 生パスワードを送信することになりますので、
> そのあたりを考慮の上、変更してください。




PHP-users メーリングリストの案内