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

Toshikazu Yoshikawa toshi @ uncut00.com
2003年 10月 3日 (金) 12:38:54 JST


お世話になっております。
アンカットテクノロジーの吉川です。

> 貴重なお時間を割いていただきありがとうございます。
> 同じように試みてみましたが、いまだ、loginform.ihtmlが読み込まれて
> しまっております。auth_preauth()がfalseを返していると思われるのですが。

田中さんのコードでは、チャレンジ・レスポンス型の認証方式を利用されているので、
外部からの直接ログインができないんですね。

外部フォームからではなく、普通に認証の必要なページにアクセスした場合、
loginform.ihtmlが表示されるわけですが、
そのとき、同時にチャレンジ文字列をサーバ側で生成し、
ログインフォームの中にhiddenタグとして埋め込み、
さらにサーバ側でもそのチャレンジ文字列を保存します。

ユーザがブラウザ上でユーザ名とパスワードを送信するときに、
JavaScriptでユーザ名、パスワード、チャレンジの連結文字列を
MD5でハッシュ化し「response」としてサーバに送りつけます。
つまり、生パスワードをネット上に流さないようにするための配慮です。

サーバ側では、送信されてきたユーザ名を手がかりに
データベースからパスワードを取得し、先ほど保存しておいたチャレンジ文字列と
ユーザ名を同様に連結してMD5でハッシュ化します。

このハッシュ化された文字列同士を比較して認証のチェックを行います。

これを外部のフォームから行おうとすると、
最初のアクセスがないために、サーバ側でチャレンジ文字列が生成されません。
なので、ハッシュ後の文字列が当然のことながら異なるものになってしまいます。
これでは、いくらがんばっても認証は通りません。

幸い、田中さんのauth_validatelogin()内には、
ユーザのブラウザでJavaScriptがOffになっているときのための
対処コードも含まれています。
「response」が空だったときの処理がそうです。

多分、外部フォームの方にもloginform.ihtmlと同様に
JavaScriptのコードが含まれていると思いますが、
それを取り除き、responseのhiddenタグもなくしたほうがいいでしょう。

ただし、せっかくのセキュリティ対策は損なわれます。
外部フォームからのログインの場合は、
生パスワードを送信することになりますので、
そのあたりを考慮の上、変更してください。

-- 
Toshikazu Yoshikawa <toshi @ uncut00.com>



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