- 締切済み
なぜ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はセットされておりませんでした。 これでなぜプロキシ経由だと判断できるのでしょう?
- みんなの回答 (2)
- 専門家の回答