Perl CGIでHTTPS化後のIPアドレス取得方法の問題解決

PHP

Perl CGIを使用している際、HTTPからHTTPSに変更すると、IPアドレスの取得方法に問題が発生することがあります。特に、$ENV{'REMOTE_ADDR'}で取得したIPが正しいものではなく、プライベートIP(例えば「172.26.5.7X」)が取得されることがあるため、この問題の解決方法について解説します。

1. HTTPS化後のIPアドレス取得の問題

HTTPからHTTPSに変更した後、$ENV{'REMOTE_ADDR'}が正しいクライアントのIPアドレスを取得しなくなった原因は、HTTPSプロトコルにより「リバースプロキシ」や「ロードバランサ」が介在している可能性があります。これにより、$ENV{'REMOTE_ADDR'}が実際のクライアントのIPアドレスではなく、プロキシサーバーやロードバランサーのIPアドレスが取得されることがあります。

2. HTTP_X_FORWARDED_FORを利用する

リバースプロキシやロードバランサーを経由する場合、実際のクライアントのIPアドレスは、HTTPヘッダーのX-Forwarded-Forに含まれることが一般的です。このヘッダーを利用することで、正しいIPアドレスを取得できます。

$ipa = $ENV{'HTTP_X_FORWARDED_FOR'} || $ENV{'REMOTE_ADDR'};

このコードは、まずHTTP_X_FORWARDED_FORに設定されたIPアドレスを確認し、それが存在しない場合にREMOTE_ADDRを使用するという仕組みです。

3. 正規表現によるIPアドレスの抽出

もし、HTTP_X_FORWARDED_FORに複数のIPアドレスが含まれている場合(リバースプロキシを複数経由している場合など)、最初のIPアドレスが実際のクライアントIPとなることが多いです。これを抽出するために、正規表現を使って最初のIPアドレスを取得する方法が有効です。

$ipa = (split /,/, $ENV{'HTTP_X_FORWARDED_FOR'})[0];

このコードは、X-Forwarded-Forヘッダーの複数のIPアドレスをカンマで分割し、最初のIPアドレスを取得します。

4. まとめ

HTTPSに切り替えた後、クライアントのIPアドレスを正確に取得するためには、HTTP_X_FORWARDED_FORヘッダーを利用することが重要です。リバースプロキシやロードバランサーが使用されている場合、REMOTE_ADDRではなく、HTTP_X_FORWARDED_FORから正しいIPアドレスを取得するようにコードを変更することで、問題を解決できます。

コメント

タイトルとURLをコピーしました