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アドレスを取得するようにコードを変更することで、問題を解決できます。


コメント