PHP では、要求された IP を取得する一般的な方法は、通常 3 つのスーパー グローバル変数を使用することですが、IP を取得する 3 つの方法が完全に信頼できるわけではないことは明らかです。
$_SERVER['REMOTE_ADDR']; // 客户端与服务器握手IP,如果使用代理则会获取到代理IP $_SERVER['HTTP_CLIENT_IP']; // 代理服务器发送的HTTP头(可伪造) $_SERVER['HTTP_X_FORWARDED_FOR']; // 用户是在哪个IP使用的代理(可伪造)
ドメイン名がプロキシされていない場合、一般に安全な方法は REMOTE_ADDR です。海外のネットワークの場合、最も安全な方法は、クラウド ベンダーが提供する信頼できるソース IP 取得方法を提供することです。 Google Cloud:
偽造 IP が表示されない場合、X-forwarded-For は通常、クライアントの実際の IP であり、負荷分散 IP
IP が表示され、Google Cloud がコンテンツを偽造します。プレフィックスの場合、形式は 、クライアントの実際の IP、負荷分散 IP
です。したがって、偽造かどうかに関係なく、文字列をカンマで切り取り、最後から 2 番目の X-forwarded を見つけます。値については、実際のクライアント IP を取得できます。
もちろん、ドメイン名クラウド ベンダーが同様のドメイン名情報を提供していない場合、スーパー グローバル変数を介して単純に情報を取得することはできません。
ドメイン名クラウド ベンダーが対応するリクエスト ソース IP 情報を提供しない場合、サーバーとの対話を通じて確認メカニズムをネゴシエートすることもできます。
同様: HTTP リクエストヘッダに送信元 IP 情報を付加して判定する サーバー間の通信処理であるため、偽造者は偽造物の具体的な情報内容を知ることができず、通常はこのようなやり取りは信頼できます。
判定ロジック処理
サーバA: HTTPリクエストヘッダに変数MY_REALIP_c32fsjk234 => "1.2.3.4"を追加します。シンプルで、MY_REALIP_c32fsjk234
リクエスター B を受け入れる: $_SERVER['MY_REALIP_c32fsjk234'] を使用して決定するのと同様に、変数名としてランダムなキーに同意することが双方にとって最善です。リクエストヘッダーに MY_REALIP_c32fsjk234 変数が含まれているかどうかを確認し、含まれている場合は、対応する IP を実 IP として取得します。
元のリンク: https://blog.csdn.net/panguangyu/article/details/122211682
推奨書籍:
#以上がPHPで実際のIPを取得する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。