src/Eccube/EventListener/IpAddrListener.php line 41

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of EC-CUBE
  4.  *
  5.  * Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
  6.  *
  7.  * http://www.ec-cube.co.jp/
  8.  *
  9.  * For the full copyright and license information, please view the LICENSE
  10.  * file that was distributed with this source code.
  11.  */
  12. namespace Eccube\EventListener;
  13. use Eccube\Common\EccubeConfig;
  14. use Eccube\Request\Context;
  15. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  16. use Symfony\Component\HttpKernel\Event\RequestEvent;
  17. use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
  18. use Symfony\Component\HttpFoundation\IpUtils;
  19. class IpAddrListener implements EventSubscriberInterface
  20. {
  21.     /**
  22.      * @var EccubeConfig
  23.      */
  24.     protected $eccubeConfig;
  25.     /**
  26.      * @var Context
  27.      */
  28.     protected $requestContext;
  29.     public function __construct(EccubeConfig $eccubeConfigContext $requestContext)
  30.     {
  31.         $this->eccubeConfig $eccubeConfig;
  32.         $this->requestContext $requestContext;
  33.     }
  34.     public function onKernelRequest(RequestEvent $event)
  35.     {
  36.         if (!$event->isMainRequest()) {
  37.             return;
  38.         }
  39.         $clientIp $event->getRequest()->getClientIp();
  40.         log_debug('Client IP: '.$clientIp);
  41.         if (!$this->requestContext->isAdmin()) {
  42.             // IPアドレス許可リスト範囲になければ拒否
  43.             $allowFrontHosts $this->eccubeConfig['eccube_front_allow_hosts'];
  44.             if (!empty($allowFrontHosts) && !$this->isClientIpInList($allowFrontHosts$clientIp)) {
  45.                 throw new AccessDeniedHttpException();
  46.             }
  47.             // IPアドレス拒否リスト範囲にあれば拒否
  48.             $denyFrontHosts =  $this->eccubeConfig['eccube_front_deny_hosts'];
  49.             if (!empty($denyFrontHosts) && $this->isClientIpInList($denyFrontHosts$clientIp)) {
  50.                 throw new AccessDeniedHttpException();
  51.             }
  52.             return;
  53.         }
  54.         // IPアドレス許可リスト範囲になければ拒否
  55.         $allowAdminHosts $this->eccubeConfig['eccube_admin_allow_hosts'];
  56.         if (!empty($allowAdminHosts) && !$this->isClientIpInList($allowAdminHosts$clientIp)) {
  57.             throw new AccessDeniedHttpException();
  58.         }
  59.         // IPアドレス拒否リストを確認
  60.         $denyAdminHosts $this->eccubeConfig['eccube_admin_deny_hosts'];
  61.         if (!empty($denyAdminHosts) && $this->isClientIpInList($denyAdminHosts$clientIp)) {
  62.             throw new AccessDeniedHttpException();
  63.         }
  64.     }
  65.     private function isClientIpInList($hostList$clientIp)
  66.     {
  67.         log_debug('Host List: 'implode(','$hostList));
  68.         if ($hostList) {
  69.             $isInList array_filter($hostList, function ($host) use ($clientIp) {
  70.                 return IpUtils::checkIp($clientIp$host);
  71.             });
  72.             return count($isInList) > 0;
  73.         }
  74.         return true;
  75.     }
  76.     public static function getSubscribedEvents()
  77.     {
  78.         return [
  79.             'kernel.request' => ['onKernelRequest'512],
  80.         ];
  81.     }
  82. }