web-dev-qa-db-ja.com

PHP

自分のWebサイトを表示する任意の種類のプロキシサーバーを使用してクライアントを検出する方法または方法を探しています。 PHP/Apacheを使用しています...これを行うための最良の方法は何ですか?具体的にどちらか一方ではなく、プロキシサーバーを検出する必要があります。

編集

通常のプロキシはHTTP_X_FORWARDED_FORを検索することで簡単に検出できるため、匿名プロキシにもっと興味があります。

別の編集

これを試して:

1) http://kproxy.com (またはその他の無料の匿名プロキシサイト)にアクセスします。

2)訪問: http://www.worldofwarcraft.com

3)「エラースタイルシートの読み込み:XSLTスタイルシートの読み込み中にネットワークエラーが発生しました: http://kproxy.com/new-hp/layout/layout.xsl "

プロキシを防ぐために同様のことをしたいです。

24
MichaelICE

X-Forwarded-Forなどのように明示的に言及する特別なヘッダーを渡さない限り、それを検出することはできません。

私の知る限り、ブラックリストを使用する必要があります。 PuTTYポートフォワーディング、VPN、またはその他のより高度な方法を使用するユーザーは、通常のユーザーとまったく同じように動作するため、操作できません。

17
TomHastjarjanto

PHPで次の2つのソリューションを使用します。 //メソッド1 =高速ですが、匿名プロキシでは機能しません

    $proxy_headers = array(
        'HTTP_VIA',
        'HTTP_X_FORWARDED_FOR',
        'HTTP_FORWARDED_FOR',
        'HTTP_X_FORWARDED',
        'HTTP_FORWARDED',
        'HTTP_CLIENT_IP',
        'HTTP_FORWARDED_FOR_IP',
        'VIA',
        'X_FORWARDED_FOR',
        'FORWARDED_FOR',
        'X_FORWARDED',
        'FORWARDED',
        'CLIENT_IP',
        'FORWARDED_FOR_IP',
        'HTTP_PROXY_CONNECTION'
    );
    foreach($proxy_headers as $x){
        if (isset($_SERVER[$x])) die("You are using a proxy!");
    }

//方法2 =使用される通常のプロキシポートでオリジンIPにポートスキャンします。

    $ports = array(8080,80,81,1080,6588,8000,3128,553,554,4480);
    foreach($ports as $port) {
         if (@fsockopen($_SERVER['REMOTE_ADDR'], $port, $errno, $errstr, 30)) {
              die("You are using a proxy!");
         }
     }
24
X-Ray

Metasploit は、クライアントシステムに強制的に直接接続させるためのさまざまな手法を使用します(Flash、Java、QuickTime、MS Office、カスタムDNSサーバーの脆弱性/誤機能)。

または、クライアントのブラウザでmetasploitを起動できない場合は、オープンプロキシ(ポートスキャン)および 既知のTor出口ノード を探すこともできます。

しかし、プロキシが悪であり、ブロックする必要があると思い込まないでください。正当なプロキシがたくさんあり、一部のユーザーはそれらを使用する必要があります。

スパムや他の乱用トラフィックに問題がある場合、プロキシをブロックするだけではあまり効果がありません。 anonymous = guilty。と仮定するのではなく、問題のコア(スパムフィルター、IDS)に対処する特定のソリューションを探す必要があります。

8
Kornel

さまざまな有料/無料ソリューションがあります。それらのほとんどは、接続しようとしているクライアントIPを調べて、プロキシ上にあるかどうかを判断します。

支払い済み:
Maxmind -詐欺の検出に重点を置いており、プロキシ検出のサブカテゴリがあります。これは「レガシー」サービスと見なされるようになったことに注意してください。

自由:
W I T C H -一意に識別可能なMSS値を調べることでOpenVPNを検出できます。コードはgithubで入手できます。

GetIpIntel -機械学習を使用したプロキシ/ VPN検出、API経由のクエリ。

さらにいくつかの無料オプションがリストされています セキュリティスタック交換

3
S W

このウェブサイトは、ソースコードに "new-hp/layout/layout.xsl"を指すアドレスがあるため、このエラーを示しています。プロキシはあなたのIPを隠したいので、それを http://kproxy.com/new-hp/layout/layout.xsl に変更して、サーバーをポイントしますが、ファイルは本当に存在するので、Flashプラグインはそれを見つけることができません。

1
Ciobanu Robert

クライアントがサーバーに渡すすべてのものは、自己構成できます。 IPアドレス以外は信頼できません。そのため、それがプロキシまたは通常のクライアントである場合は、ヘッダーデータを確認できません。
ところで:プロキシであることを示さないのはプロキシの意図です:)

確かに、リクエスタのIPアドレスを取得して、プロキシに送信するhttpリクエストを送信できます。それが反応するなら、それはプロキシかもしれません、そうでなければ、それは通常のクライアントです。この方法は非常に高価で信頼性がありません。サーバーが要求したプロキシがファイアウォールの背後にある場合、応答は得られず、通常のクライアントであると考えられます。

1
guerda

ここで起こっていることは、クライアント側のJavaScriptが何かをロードしようとしていることであり、ページがフレーム内に表示されていることを「確認」できると思います。他の回答が示しているように、プロキシは意図的にサーバーだけから判断することを困難にします。

1
araqnid

古いトピックですが、何かがわかったかもしれません。

それは私のサイトで公開されており、ほとんどの場合はうまくいくと思います。

私の問題は、禁止されたユーザーが私のサイトに戻って、あなたが見つけることができる多くのプロキシの1つを使用して新しいメールアドレスで再登録していることでした。私が行ったことは、登録/ログインフォームでの単純なjQuery呼び出しです。

<form id="login_form" method="post" action="/#fake_login_url">
   stuff you need for the form
</form>
<script>
   $('#login_form').attr('action','real_login_form');
</script>
1
Fabrizio

古い質問であっても、プロキシを確認する必要がありましたが、残念ながらどの回答も良い結果をもたらしません。

検索した後、私はより良い方法を見つけました。この方法を理解するには、次のコードで小さなページを作成します。

 <?php
 foreach ($_SERVER as $key => $val)
 {
     echo $key."<br>\n";  
 }
 ?>

サーバーから直接実行します。サーバーが送信しているヘッダーのすべてのキーが表示されます。次に、プロキシ経由で同じスクリプトを実行します。 (プロキシに応じて)3つの可能な結果が表示されます。

  1. プロキシはニュースのキー/値を追加します
  2. プロキシは元のキー/値のすべてを送信しないため、一部が欠落しています。
  3. プロキシはまったく同じキー/値を送信しますが、同じ順序ではありません
  4. プロキシはまったく同じキー/値を同じ順序で送信します

4番目のケースが発生する可能性がありますが、他のケースが最も頻繁です。したがって、サーバーからのキー/値を使用して配列を作成し(プロキシなしでスクリプトを実行したときの結果に基づく)、$ _ SERVERのキー/値を比較するだけです。まったく同じキー/値がない場合(少ない、多い、または他の順序)、ページがプロキシからのものであると想定できます。

一部のケースではプロキシが「法的」に使用できると私が同意することに注意してください。

0
Peter