7

私のアプリは、サイトにログインしているユーザーのIPアドレスを追跡します。追跡は通常のWebサーバー(hostgatorを使用)では正常に機能していましたが、PaaSプラットフォーム(pagodabox)に切り替えると、奇数のIPアドレスの追跡を開始したようです。 pagodaboxのロードバランサー/ルーターのIPと、ユーザーの実際のIPアドレスを取得するには、使用する必要がありますHTTP_X_FORWARDED_FOR

codeigniterの入力クラス関数$this->input->ip_address()を使用してユーザーのIPを取得していました。関数を見て、IP値を取得するための何らかの機能があることに気づきましたが、 HTTP_X_FORWARDED_FOR使用方法がわかりません。設定で何かを変更/追加する必要がありますか?

編集:ロードバランサーのIPアドレスのリストのどこに追加する必要があるかを数人のユーザーが指摘した後、新しい質問が出てきました:IPのリストが頻繁に変更される場合はどうすればよいですか?(つまり、静的IPなし、すべて動的)

4

7 に答える 7

12

これはもう解決したと思いますが、今後の参考のために正解を投稿したいと思いました。これと同じ問題に遭遇しました(CodeIgniterアプリでAWSのロードバランサーを使用します)。ご指摘のとおり、HTTP_X_FORWARDED_FORヘッダーを使用して、ロードバランサーまたはその他の分散環境の背後で正しいIPを取得するのは簡単です。問題は、CodeIgniterでこのソリューションを正しく実装する方法です。前の答えが指摘しているように、独自のIP関数を記述します。これに伴う問題は、アプリ全体でip_address()が呼び出された場合はどうなるでしょうか。その関数を(正しいヘッダーを調べる関数で)オーバーライドする方が良いのではないでしょうか?CodeIgniterには、このための便利なメカニズムがあり、便利です。

解決策は、MY_Input.phpという名前の新しいクラスファイルを/ application / coreに作成することにより、CodeIgniter Inputクラスを拡張することです(MY_は拡張機能の構成可能なプレフィックスであり、構成ファイルで変更できます)。拡張機能を使用すると、何も壊さずに、コアファイルを編集せずに、元のクラスメソッドと同じ名前の関数を作成できます。CodeIgniterは、代わりに新しいメソッドを使用します。拡張入力クラスは次のようになります。

class MY_Input extends CI_Input {

    function __construct()
    {
        parent::__construct();
    }
    //Overide ip_address() with your own function
    function ip_address() 
    {
        //Obtain the IP address however you'd like, you may want to do additional validation, etc..
        $correct_ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];  
        return $correct_ip_address;
    }
}

このようにして、フレームワークをハッキングせずにコアの動作を変更し、アプリ全体でのip_address()への既存の呼び出しがメソッドを使用するようになります。

チェーン内の他のIPの処理に関しては、クライアントIPのみに関心がある場合は、問題ではありません。少なくともAWSロードバランサーでは、HTTP_X_FORWARDED_FORヘッダーに常に正しいクライアントIPが含まれているようです。

于 2013-04-28T16:28:03.367 に答える
9

オリバーのソリューションは機能しますが、状況によっては、使用されているプロキシIPアドレスがわかっている場合は、以下を使用することをお勧めします。application / config / config.phpファイルを編集して、以下を含めます。

$config['proxy_ips'] = '1.2.3.4, 2.3.4.5';

また、ヘッダー情報は通常信頼性が低く、セキュリティ上重要な目的で使用すべきではないという事実にも注意してください。たとえば、管理者ユーザーがホワイトリストに登録された一部のIPアドレスのみを使用するように制限することは珍しくありません。

于 2013-12-19T10:00:58.823 に答える
3
<?php 
function getIPfromXForwarded() 
{ 
    $ipString = @getenv("HTTP_X_FORWARDED_FOR"); 
    $addr     = explode(",",$ipString); 

    return $addr[sizeof($addr)-1]; 
} 
?> 

そのようなことを試してください。それが機能するかどうかを確認します。使用法:

<? echo getIPfromXForwarded(); ?>
于 2013-01-23T23:08:25.770 に答える
3

あなたの場合、指定されたロードバランサーIPを$config['proxy_ips']application/config/config.php)に追加できます。次に例を示します。

$config['proxy_ips'] = ['192.168.1.2'];

動的プロキシIP:

動的IPの問題に応じて、次のように、ロードバランサーネットワークのIP範囲をマスクできます。

 $config['proxy_ips'] = '192.168.1.0/24';

マスク機能はCodeigniter3で使用できます


IPメソッドを取得します。

$this->input->ip_address();

一方$thisはCIインスタンスを指します。

このメソッドは$config['proxy_ips']設定を考慮し、許可されたIPアドレスに対して報告されたHTTP_X_FORWARDED_FOR、HTTP_CLIENT_IP、HTTP_X_CLIENT_IP、またはHTTP_X_CLUSTER_CLIENT_IPアドレスを返します。

于 2017-07-07T15:07:08.130 に答える
2

私はあなたの質問に関連し、あなたに受け入れられる良い答えがあることを知っていますが、将来のユーザーのために、私はすべての状況で私のために完全に機能する機能を共有しています。

 public function ip()
    {
        $ipaddress = '';
        if ($_SERVER['HTTP_CLIENT_IP'])
            $ipaddress = $_SERVER['HTTP_CLIENT_IP'];
        else if($_SERVER['HTTP_X_FORWARDED_FOR'])
            $ipaddress = $_SERVER['HTTP_X_FORWARDED_FOR'];
        else if($_SERVER['HTTP_X_FORWARDED'])
            $ipaddress = $_SERVER['HTTP_X_FORWARDED'];
        else if($_SERVER['HTTP_FORWARDED_FOR'])
            $ipaddress = $_SERVER['HTTP_FORWARDED_FOR'];
        else if($_SERVER['HTTP_FORWARDED'])
            $ipaddress = $_SERVER['HTTP_FORWARDED'];
        else if($_SERVER['REMOTE_ADDR'])
            $ipaddress = $_SERVER['REMOTE_ADDR'];
        else
            $ipaddress = 'UNKNOWN';
        echo $ipaddress ;
     }
于 2015-05-04T09:53:43.643 に答える
2

ロードバランサーのIPが変更される可能性がある状況(AWSなど)でうまく機能し、CI構成ファイルをネイティブに活用するThavaのソリューションのバージョンに出くわしました。LBの背後で実行していることがわかっている場合は、config.phpを次のように変更できます。

$config['proxy_ips'] = isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : '';

REMOTE_ADDRが常に現在のLBになることを知っています。

ここでEricBrownに感謝しますhttps://expressionengine.com/forums/archive/topic/185751/amazon-load-balancing-and-codeigniter-configproxy_ips#925678

于 2017-06-21T14:42:21.500 に答える
1

IPが実際には「動的」ではなかったが、プロキシとロードバランサーを管理する「インフラストラクチャの人々」が非公開の理由でそれらを変更していたことを除いて、私は同じような状況で仕事をしていました。そのため、交渉する必要があり、構成/プロビジョニング管理ツールにフックを設定して、構成ファイルをどこかに(Apache / PHPを実行しているユーザーがアクセスできるフォルダーに)書き込むためのソリューションを考え出しました。

そこで、CIフックを使用して、システムブートストラップでそのファイルを読み取り、アプリの構成を変更し、プロキシIPリスト、キャッシュパス、Cookieドメインなどの値を更新しました。

于 2014-11-06T18:53:19.847 に答える