- PR -

Refererチェックページの遷移について

1
投稿者投稿内容
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2006-10-25 20:02
いつも勉強させていただいております。

素人のような質問で申し訳ないのですが、Refererをチェックしている
ログインページに対し、自動的に認証させる仕組みを検討しています。

検討しているのは、AというページにアクセスすることによりBという
ログインページを自動的に認証させようと思っております。
ちなみに、Aは別ドメインを検討していますので、Refererチェックで
ひっかかります。

string url = string.Format(@"BのURL");
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.Referer = string.Format(@"BのURL");

などと考えていますが、問題はこの後どのようにBに遷移させれば
良いのでしょうか?
またこれらのデータを送る方法も、色々試してましたが実現できて
ません。

具体的な方法等ご存知の方いらっしゃいましたら、ご教授お願い
します。
よろしくお願いします。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-10-26 01:55
正直、リファラチェックでAからのアクセスを許可してあげればいいと思うのですが何故だめなのですか?

(Bは認証前でもリファラチェックに引っかからなければアクセスできるのですよね?)
引用:
string url = string.Format(@"BのURL");
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.Referer = string.Format(@"BのURL");

これだとAを処理しているサーバがBに対してクライアントになります。Bのレスポンスを受け取るのは
A(のサーバ)ですから、それを更にAにアクセスしているクライアント(ブラウザ)に返してやる
必要があります。なので、
引用:
などと考えていますが、問題はこの後どのようにBに遷移させれば
良いのでしょうか?

[Bに遷移]ではないですが、request.GetResponseした中身をレスポンスとして返す、でしょうかね。
Aがブラウザの代わりにBにアクセスして、中身をブラウザに見せてあげる、イメージですかね。

しかし、ここまででは認証を通したことにはならないと思います。

Bでのログイン方法は?たとえばFormにIDとパスワード入力してPOST?だとすれば
POST先に直接リクエストすればいいと思います。(それが「データを送る方法」なのかな?)

#あれ、認証状態のチェック方法は?たとえばクッキーに何か埋め込む?だとすると
#Bのドメインに有効なクッキーはBからしか埋め込めないから、Aにアクセスして
#自動認証は無理な気もする。この先Aがクライアントの変わりになり続ければいいのかな?
#正直混乱してきました。
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2006-10-26 08:41
べる様ご返答ありがとうございます。

引用:

べるさんの書き込み (2006-10-26 01:55) より:
正直、リファラチェックでAからのアクセスを許可してあげればいいと思うのですが何故だめなのですか?



開発環境からチェックしようと思っておりまして、それに
アクセスしたいBは本番系のサーバなので、その辺の設定は
変えられない状況になってます。

引用:

(Bは認証前でもリファラチェックに引っかからなければアクセスできるのですよね?)
string url = string.Format(@"BのURL");
HttpWebRequest request = (HttpWebRequest) WebRequest.Create(url);
request.Referer = string.Format(@"BのURL");
これだとAを処理しているサーバがBに対してクライアントになります。Bのレスポンスを受け取るのは
A(のサーバ)ですから、それを更にAにアクセスしているクライアント(ブラウザ)に返してやる
必要があります。なので、

引用:
などと考えていますが、問題はこの後どのようにBに遷移させれば
良いのでしょうか?

[Bに遷移]ではないですが、request.GetResponseした中身をレスポンスとして返す、でしょうかね。
Aがブラウザの代わりにBにアクセスして、中身をブラウザに見せてあげる、イメージですかね。

しかし、ここまででは認証を通したことにはならないと思います。



言葉足らずで申し訳ありませんでした。
CというページでID、PWを入力し、BにPOSTで投げているページが
あります。
通常の流れですと、C→B→Dでログイン完了となりDのページが
表示されます。
勿論B、C、Dは同じドメインです。

そこで、今回A→B→Dを検討しましたが、ID、PWのデータの送信以前に
Refererでひっかかったので、まずその点を何とかしたいと思い、
ここで質問しました。

べる様のおっしゃる通りで、擬似的にrequest.GetResponseで
A上でBのページを取得し、表示することは可能なのですが、
Bでは認証後Dのページに自動的に遷移しますが、これがうまく
行きません。

引用:

Bでのログイン方法は?たとえばFormにIDとパスワード入力してPOST?だとすれば
POST先に直接リクエストすればいいと思います。(それが「データを送る方法」なのかな?)

#あれ、認証状態のチェック方法は?たとえばクッキーに何か埋め込む?だとすると
#Bのドメインに有効なクッキーはBからしか埋め込めないから、Aにアクセスして
#自動認証は無理な気もする。この先Aがクライアントの変わりになり続ければいいのかな?
#正直混乱してきました。



おっしゃる通りで、ここが自分が悩んでいる点です。
認証方法はBで
1.Refererチェック
2.ID、PWチェック
3.認証OKのセッションクッキー生成
4.Dに遷移(Dでは、セッションクッキーチェック)

ですので、A→BにおいてRefererを擬似的に設定し、
ID、PWをPOSTで送ればいけるのでは?
と思っているのですが、実際どうなんでしょう?

長々書いて申し訳ありませんが、
よろしくご教授お願いします。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2006-10-26 12:41
引用:
開発環境からチェックしようと思っておりまして、それに
アクセスしたいBは本番系のサーバなので、その辺の設定は
変えられない状況になってます。

なるほど。まったく関係ないサイトのリファラチェックを突破してしまおいうアレなのかと思っちゃいまして。

引用:
CというページでID、PWを入力し、BにPOSTで投げているページが
あります。
通常の流れですと、C→B→Dでログイン完了となりDのページが
表示されます。
勿論B、C、Dは同じドメインです。

なるほど、勘違いしてました。

引用:
Bでは認証後Dのページに自動的に遷移しますが、これがうまく
行きません。

パスとIDを送ることには成功したのですか?
これができていないならDの内容は取得できないのが正しい動きですね。

どのようにBからDに遷移させているのですか?たとえばResponse.Redirectとかだと[location]HTTPヘッダに
URLが送られ、ブラウザはそれを解釈して自分でDを見に行きます。

また、前述したようなクッキー関係の理由でクライアントにDそのものを表示させることは
できない気がします(試してはいませんが)。Bへのリクエストで得られるクッキーをrequest.CookieContainerに
セットして再び同様にアクセスすれば、擬似的にDを見せてあげるところまではできるかもしれません。
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2007-01-22 16:03
昨年の質問ですが、こちらは解決したのですが、新たな問題が
発生し、解決できない状況ですので、またこの項で質問させて
いただきます。

まず、Refererの受渡しですが、C#のWindowアプリ上で
「AxSHDocVw.AxWebBrowser」を使用することにより、解決しました。
Refererの受渡しだけでなく、Cookie値も受け渡すことができたので、
ほとんどの要件は満たしています。

ただ、こちらはあくまでもWindowForm上で起動しているという
認識になるらしく、表示されるブラウザの画面内に子Windowを
開くリンクがあり、子Windowの方でもCookie値をチェック
しているのですが、うまく引き継がれません。

どうにか解決したいのですが、やはりIEを開いた挙動と一致させるのは
不可能なのでしょうか?

下記がページを開く関数になります。

private AxSHDocVw.AxWebBrowser axWebBrowser1;

public Main()
{
//例:google
string strURL=@"http://www.google.co.jp/";
// Header
string strHeader = @"Content-Type: application/x-www-form-urlencoded" + "\n" + "\r"
+ @"Referer: http://www.google.co.jp/";

BrowserNavConstants contents =
BrowserNavConstants.navNoHistory |
BrowserNavConstants.navNoReadFromCache;

string strTarget = "";
// POSTするデータ
string strPostData = @"txtUserId=test&txtPassword=test";
object objURL = strURL;
object objFlag = contents;
object objTarget = strTarget;
object objPostData = ASCIIEncoding.ASCII.GetBytes(strPostData);
object objHeader = strHeader;

// Navigateする
axWebBrowser1.Navigate2( ref objURL, ref objFlag,
ref objTarget, ref objPostData, ref objHeader);
}

よろしくご教授お願いします。
べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-01-23 20:28
引用:
ただ、こちらはあくまでもWindowForm上で起動しているという
認識になるらしく、表示されるブラウザの画面内に子Windowを
開くリンクがあり、子Windowの方でもCookie値をチェック
しているのですが、うまく引き継がれません。

当方ではAxWebBrowserでアクセスしたときに発行されたクッキーがブラウザで
見たときにも渡されていましたよ。クッキー発行のコードはどうなっていますか?

また、ブラウザ→ブラウザの場合はちゃんと取得できていますか?
発行したタイミングでクッキーファイルにちゃんと書かれているかも確認手段の一つですね。
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2007-01-24 11:28
べる様ご返答ありがとうございます。

引用:

また、ブラウザ→ブラウザの場合はちゃんと取得できていますか?
発行したタイミングでクッキーファイルにちゃんと書かれているかも確認手段の一つですね。



こちらで使用しているクッキーはセッションクッキーでして、
ブラウザが開いている時のみ、保持されるタイプです。

ブラウザ→ブラウザは問題無く遷移
WindowForm→WindowFormは問題なく遷移
WindowForm→ブラウザはダメ

という状況になっています。
今、WindowFormから新規ブラウザが立ち上がらないように
改良しております。
そうすれば、WindowForm→WindowFormで問題無くいけるの
ではと思ってるんですが、これがなかなか難しくて・・・

何かこの辺の技術を知っている方いらっしゃいましたら、
ご教授お願いします。

べる
ぬし
会議室デビュー日: 2003/09/20
投稿数: 1093
投稿日時: 2007-01-24 12:01
引用:
という状況になっています。
今、WindowFormから新規ブラウザが立ち上がらないように
改良しております。
そうすれば、WindowForm→WindowFormで問題無くいけるの
ではと思ってるんですが、これがなかなか難しくて・・・

方法論的にはNewWindow2かNewWindow3を捕まえてキャンセルして、
独自に遷移させてあげればいいような気がします。
1

スキルアップ/キャリアアップ(JOB@IT)