サーバー担当の山内です。
ロードバランサー経由でアクセスしてきたクライアントのIPアドレスを取得するためreal_ip()を使っていたのですが、FuelPHPをv1.6以降にアップデートした際にうまく取れなくなる問題が起こりました。
FuelPHP v1.5以前については、こちらのエントリーをご覧ください。
FuelPHPでロードバランサーを経由してきたクライアントのIPを取得する
前バージョンのreal_ip()と比較すると、\Config::get('security.allow_x_headers', false)がtrueの場合にHTTP_X_CLUSTER_CLIENT_IPとHTTP_X_FORWARDED_FORを取得するように変更されていることがわかりました。
--- input.php Mar 19 02:43 2013 +++ input.php Dec 03 19:05 2013 public static function real_ip($default = '0.0.0.0', $exclude_reserved = false) { - $server_keys = array('HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_X_FORWARDED_FOR', 'HTTP_CLIENT_IP', 'REMOTE_ADDR'); + static $server_keys = null; + if (empty($server_keys)) + { + $server_keys = array('HTTP_CLIENT_IP', 'REMOTE_ADDR'); + if (\Config::get('security.allow_x_headers', false)) + { + $server_keys = array_merge(array('HTTP_X_CLUSTER_CLIENT_IP', 'HTTP_X_FORWARDED_FOR'), $server_keys); + } + } foreach ($server_keys as $key) { if ( ! static::server($key)) { continue;
fuel/app/config/config.phpの132行目を有効にします。
'security' => array( // 'csrf_autoload' => false, // 'csrf_token_key' => 'fuel_csrf_token', // 'csrf_expiration' => 0, /** * A salt to make sure the generated security tokens are not predictable */ // 'token_salt' => 'put your salt value here to make the token more secure', /** * Allow the Input class to use X headers when present * * Examples of these are HTTP_X_FORWARDED_FOR and HTTP_X_FORWARDED_PROTO, which * can be faked which could have security implications */ 'allow_x_headers' => true, /** * This input filter can be any normal PHP function as well as 'xss_clean' * * WARNING: Using xss_clean will cause a performance hit. * How much is dependant on how much input data there is. */
以上でFuelPHP v1.6以降においても
real_ip()でロードバランサー経由のクライアントIPアドレスを取得できます。
ただしconfig.phpのコメントにもあるように、HTTP_X_FORWARDED_FORは偽装できますので注意しましょう。