エンジニア

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

投稿日:2015年9月24日 更新日:

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

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

採用情報

ワンダープラネットでは、一緒に働く仲間を幅広い職種で募集しております。

-エンジニア
-,

© WonderPlanet Inc.