WonderPlanet DEVELOPER BLOG

ワンダープラネットの開発者ブログです。モバイルゲーム開発情報を発信。

FuelPHP v1.6以降でロードバランサーを経由してきたクライアントのIPを取得する方法

サーバー担当の山内です。

ロードバランサー経由でアクセスしてきたクライアントの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は偽装できますので注意しましょう。