• 締切済み

なぜHTTP_X_FORWARDED_FORで

function isproxy() { return (isset($_SERVER['HTTP_VIA']) || isset($_SERVER['CLIENT_IP']) || isset($_SERVER['HTTP_X_FORWARDED_FOR'])); } $msg = isproxy() ? 'プロキシ経由である' : 'プロキシ経由ではない'; なぜ上記のソースでプロキシだと判断できるのかが分かりません。 前の二つの変数はまだわかるんですが、HTTP_X_FORWARDED_FORについてはプロキシでなくてもセットされて生のIPアドレスが収納されますよね。 functionのところで、三つの内一つでも変数が存在するならTrueを返せってことですよね? その下のクエスチョンとコロンで作られた式がよく分かりませんが、おそらく関数で返ってきた値を判断してクエスチョンの後に書かれたものを結果とするものだと思います。 コロンを挟んで左側がTrueだった場合、右側がFalseだった場合の結果ですよね。 問題はこの関数ですが、プロキシ経由だろうと生だろうと、Trueを返すのではないでしょうか? というのも、HTTP_X_FORWARDED_FORはプロキシ経由じゃなくてもセットされて生アドレスが収納されますよね? 実際、確かめてみたところ、プロキシでアクセスすればプロキシのアドレスが、生でアクセスすれば生アドレスが収納されており、どちらにせよHTTP_X_FORWARDED_FORはセットされていました。 これじゃどちらでも「プロキシ経由である」と出ると思ってたら、ちゃんと生のときは「プロキシ経由ではない」と出ました。 何か僕の解釈は間違えているのでしょうか? 試したプロキシは匿名性が高いとされているもので、HTTP_X_FORWARDED_FORの中で通常、カンマを挟んでいくつかアドレスが収納されるのに対して、このプロキシでは生の時みたいに一つしか収納されないので、アドレスの数で判断はできないと思います。 また、HTTP_VIAとCLIENT_IPはセットされておりませんでした。 これでなぜプロキシ経由だと判断できるのでしょう?

みんなの回答

  • t_ohta
  • ベストアンサー率38% (5238/13705)
回答No.2

X-Forwarded-for はプロキシ経由やロードバランサーを経由してアクセスして来た場合に付加されるヘッダーなので、本来なら直アクセスの場合は無い値です。 どのような環境で確認されたのか判りませんが、何か経由する装置が間に挟まっているのでしょう。 「クエスチョンとコロンで作られた式」は三項演算子です。 http://php.net/manual/ja/language.operators.comparison.php

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

> 実際、確かめてみたところ、プロキシでアクセスすればプロキシのアドレスが、生でアクセスすれば生アドレスが収納されており、どちらにせよHTTP_X_FORWARDED_FORはセットされていました。 あり得る可能性としては、 1.あなたが知らないだけで実はProxyサーバー(ないし類似の物)経由でアクセスしている 参考:https://ja.wikipedia.org/wiki/X-Forwarded-For 2.特殊なブラウザ設定で、X-Forwarded-for: ヘッダをブラウザで付加するようになっている のどちらかでしょう。 まず間違いなく1のケースですね。

関連するQ&A