CakePHP3.2.5で、Cake\Network\Request::clientIp()
が変更され、HTTP_CLIENT_IP
を見るのはRequest::trustProxy
がtrue
の時のみになりました。(HTTP_CLIENT_IP
は偽装されるおそれがあるため。)
なので、ロードバランサーやプロキシを介している場合は、
$this->request->trustProxy = true;
$clientIp = $this->request->clientIp();
とすれば、今までのようにHTTP_X_FORWARDED_FOR
やHTTP_CLIENT_IP
を見ますが、trustProxy
がfalse
の場合(デフォルト)なら、REMOTE_ADDR
だけを見ます。(以前はHTTP_CLIENT_IP
やHTTP_CLIENTADDRESS
も見ていた。)
というわけで、今まで$this->request->clientIp()
を使っていたものが、CakePHP3.2.5へのバージョンアップでそのまま動くかどうかは、少し確認が必要だと思います。(元々REMOTE_ADDR
の値が使われていた場合は問題ないはず。)
ユニットテストについて
clientIp()
を使用してアクセス制御をしているような部分をテストする場合、私は、
public function testIpOk()
{
$allowedIp = '192.168.1.1';
$this->configRequest([
'headers' => ['CLIENT_IP' => $allowedIp]
]);
$this->get('/articles');
$this->assertResponseOk();
}
という感じで、configRequest()
でheaders
にCLIENT_IP
を指定(HTTP_CLIENT_IP
がセットされることになる)していたのですが、これだと今回の更新でclientIp()
から値が返ってこなくなります。
headers
に指定すると勝手にHTTP_
が頭に付くし、REMOTE_ADDR
を指定するにはどうしたら、、、と思ってたら、environment
でセットできました。
public function testIpOk()
{
$allowedIp = '192.168.1.1';
$this->configRequest([
'environment' => ['REMOTE_ADDR' => $allowedIp]
]);
$this->get('/articles');
$this->assertResponseOk();
}