ユーザーの認証方法について質問です。

別サーバでドメインも異なる2つのサイト(A、B)があります。
Aのサイトにはフォームの認証がありセッションで認証を保持しています。
そこからBのサイトにリンクします。
BのサイトはAのサイトからのアクセスは許可し、それ以外はフォームで認証をさせます。

このような場合、B側ではリファラを確認して処理を分岐させることを思いつきますが、それ以外の方法はあるでしょうか?
(サイトAのIPアドレスは取得できるのでしょうか・・・)

なおサイトAはApache+PHP、サイトBはIIS6+ASPです。

回答の条件
  • 1人2回まで
  • 登録:2007/03/14 17:52:35
  • 終了:2007/03/21 17:55:03

回答(2件)

id:andalusia No.1

andalusia回答回数134ベストアンサー獲得回数122007/03/14 18:50:58

ポイント35pt

リファラなんて簡単に偽造できますので、ダメと思います。


また、経路上での盗聴を防ぐためには、チャレンジレスポンス方式で認証を行うのがよいと思います。


  1. Aサイトから、Bサイトへのリンクを表示する際に、AサイトのサーバサイドでBサイトのチャレンジコード発行サービスにアクセスする。

  2. Bサイトでは、乱数をもとにチャレンジコードを発行し、Aサイトに返す。また、Bサイトのサーバサイドに記憶する。
  3. Aサイト内で、チャレンジコードを鍵に、AサイトとBサイトで共通に知っている秘密のパスワードを暗号化し、チャレンジコードとともにユーザに返すBサイトへのリンクに含める。
  4. ユーザがBサイトへのリンクを踏んだ際に、Bサイトのサーバサイドで、
    1. チャレンジコードを鍵に秘密のパスワードを暗号化し、リンクについてきたものと比較する。
    2. チャレンジコードが確かに自サイトで発行したものである。
    の両方満たしたなら認証OK。
  5. Bサイト上で、認証に使われたチャレンジコードを失効させる(2回目はダメ。ワンタイムのみOK)。さらに安全のため、一定時間使われなかったチャレンジコードも失効させる。

id:umakoya

>リファラなんて簡単に偽造できますので、ダメと思います。

私もこの点を懸念しています。

頂いた回答ですと大規模なシステムになりそうです。

できればB側のスクリプトレベルで制御できれば・・・。

(認証をかけているとはいえ、それほど重要なページでもないので)

2007/03/14 19:50:59
id:llusall No.2

llusall回答回数505ベストアンサー獲得回数612007/03/14 23:39:43

ポイント35pt

あんまり難しいことはわからないのですが、

要するにAサイトからBサイトへ遷移する際に、認証チケットのようなものを提示させて自動でサインオンさせれば良いということですよね。

認証チケットのようなものをMD5でこしらえて持たせてあげれば良いかと思います。


・Aサイト、Bサイトで共通の秘密鍵を用意する。

   仮に、SECRET_CERT_KEY_A = SECRET_CERT_KEY_B とします。


・Aサイトでは、ログイン中のクライアントに認証チケットを発行。

   認証チケットは、MD5でハッシュ値を生成して作成

     AUTH_TICKET_A = MD5(SECRET_CERT_KEY_A+ユーザ識別ID+年月日時分秒)+(ユーザ識別ID+年月日時分秒)


・AサイトからBサイトへの遷移時に、POSTなりGETなりで、AUTH_TICKET_A を渡す。


・Bサイトでは、AUTH_TICKET_A を調べる。

     AUTH_TICKET_A より、[MD5部分]と[それ以外の部分](ユーザ識別ID+年月日時分秒)とに分解。

     AUTH_TICKET_B = MD5(SECRET_CERT_KEY_B+[それ以外の部分])+[それ以外の部分]

     AUTH_TICKET_A=AUTH_TICKET_Bの場合はOK。

     ユーザ識別IDから、誰べえが来たか判断。

     メニューのページ等へ。

     NGの場合は、あさっての方向にリダイレクト。


以上のような感じでいかがでしょうか?


※年月日時分秒を織り込んだのは、毎回異なるチケットにするため。

※ユーザ識別IDとは、AサイトやBサイトへのフォーム認証?独自認証?の際のユーザーID等では無いこと。

   レプリケーションIDのようなものでも良いですし、ユーザを識別できる適当なもので良いとおもいます。

   ユーザーIDとは悟られないようなIDw

※MD5だとかSHA1だとか適当に実装してみてください。

※自身でちょいと工夫することでもっとセキュアにすることも可能かと思います。

  なるべく年月日時分秒とわからないように工夫するとか・・・古い時間のチケットは無効とするとか・・・


なお、当該方法は、「私の思いつき」による物ですw

正しいかどうかは全くわかりませんし、あまりセキュアではないかもしれません。

あくまでも「例」ですので、ご参考までにと思います。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません