>>3449 Mule > $host = gethostbyaddr(pack("C4",split /\./,$addr),2) if($host eq '' || $host eq $addr); 逆引きに成功したら (つまりクライアントが FQDN を持って いたら) proxy 経由でない、逆引きに失敗したら proxy 経由 という判定方法ですね。 これは proxy 判定にはなっていません。なぜなら技術的には、 「FQDN を持つかどうかと proxy サーバであるかどうか」 は関係がないからです。 後は統計的に 「proxy サーバは FQDN を持たないケースが多い」 と言えるかどうかですが、特にそういうこともないと思います。 むしろわたしは 「proxy サーバは FQDN を持つ可能性が高い」 と思います。 > 素朴に疑問なのですが、最初にtelnetを起動して、接続元に > 接続できるかどうかの判定を行わなければ、理屈的に無理 > なのでしょうか? 理屈的には、100% の精度の proxy 判定は不可能です。 ただ、完璧でなくていいなら、以下のような策はあります。 1. proxy 特有のヘッダ、例えば以下のようなものが設定されて いるか調べる。 HTTP_PROXY_CONNECTION HTTP_SP_HOST HTTP_VIA HTTP_X_FORWARDED_FOR http://taruo.net/e/ などで判定しているのはコレでしょう。 http://www2s.biglobe.ne.jp/~cru/library/lq/index.html でも 同様の判定を行っているようです。 ただし、proxy サーバの管理者が適切に設定すれば、これらの ヘッダを渡さないようにすることは可能です。 2. クライアント側の適当なポートに接続し、公開 proxy か どうか (誰でも接続できる proxy かどうか) 判断する。 例えば 2ch ではこれをやっているんでしょう。 http://info.2ch.net/guide/faq.html#F5 ただし、以下のような欠点があります。 - どのポート番号に接続するかは適当に決めなければならない。 全ポートをポートスキャンしていると時間がかかる。 - あくまで「公開 proxy」かどうかの判定にしか使えない。 (世の中の proxy の大多数を占める) 特定のネットワーク内から のみ使用可能な proxy は判定できない。 - ポートスキャンは反社会的。やりすぎると相手からクレームを 付けられる可能性が高い。 3. telnet・Java Applet などで直接接続させるよう仕向ける。 詳しくは以下のサイトをどうぞ。 http://akademeia.info/main/lecture3/tokubetu_IP_nuki.htm http://www.nurs.or.jp/~telnet/tips.html の 「telnetプロトコルによるIP抜き」 ただしこれも反社会的です。いきなりこれをやられたら、 わたしならそのサイトには二度と行きません。 普通は 1 でやめておくのがいいでしょう。2・3 は真面目な ページでやるには過激すぎると思います。 |