ちょっとハマったのでメモ
はじめに
運営しているサイトで攻撃を防ぐためにWAF製品を導入している。
問題があって、一度WAFを経由してくるためにアクセスしてきたユーザーのIPが変更されてしまってアクセス元のIPが取得できていなかった。
それまではPHPで$_SERVER['REMOTE_ADDR']
としておけばIPを取得出来ていたのだが、このIPが変換されたものだと気づいたので対処することになった。
X-FORWARD-FORで取得するというのはわかったのだけど、どこのサイトを見てもhttpd.conf
を編集するというのが前提で説明されていた。運営しているサイトのサーバーがXserverだったので、いじれる部分に制限があったために詰まった。結果的に.htaccess
に書くことで解決できた。
手順
.htaccess
の最終行とかに以下を追記
// X-FORWARD-FORを使えるようにする
%{X-Forwarded-For}i
アクセス元のIPを取得したいPHPファイルで以下を書く
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
//自分の環境下では以上だと接続元と変換後のIPが取得されていたので、以下のようにexplodeを使って配列にして抜き出す処理を書く
// 取得例:"アクセス元IP, 経由後IP"
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
$_SERVER['REMOTE_ADDR'] = explode(",",$_SERVER['HTTP_X_FORWARDED_FOR']);
}
// explodeを使ってカンマ区切りに分割
//取得例[0] => "アクセス元IP", [1] => "経由後IP"
//なのでアクセス元IPを使いたい時は、添字を入れれば取得出来る
echo $_SERVER['REMOTE_ADDR'][0]
全然いい方法ではないかと思うので、ツッコミどころあったらコメントください