123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687 |
- <?php
- namespace AuthBundle\Utils;
- use Symfony\Component\HttpFoundation\IpUtils as SfIpUtils;
- class IpUtils
- {
- /**
- * @param string $clientIp
- * @param array $ips
- *
- * @return boolean
- */
- public static function checkIp($clientIp, $ips = array())
- {
- if (IpUtils::isIp($clientIp) === false) {
- return false;
- }
- // Se filtran las ips pasadas como parametros
- $ips = array_filter($ips, function($ip) {
- return IpUtils::isIp($ip);
- });
- // existe la variable de entorno API_CIDR ?
- // ej. API_CIDR = 127.0.0.1, 127.0.0.1-127.0.0.10, 127.0.0.1/24
- if (getenv("API_CIDR") !== false) {
- $API_CIDR = getenv("API_CIDR");
- $pieces = array_map('trim', explode(',', $API_CIDR));
- foreach ($pieces as $ip) {
- if (strpos($ip, '-') !== false) {
- $this->getIpRange($ip, $ips);
- } elseif (IpUtils::isIp($ip)) {
- $ips[] = $ip;
- }
- }
- }
- foreach ($ips as $ip) {
- if (SfIpUtils::checkIp($clientIp, $ip)) {
- return true;
- }
- }
- return false;
- }
- /**
- * @param string $ipRange
- * @param array $ips
- *
- * @return array
- */
- public function getIpRange($ipRange, $ips = array())
- {
- $pieces = array_map('trim', explode('-', $ipRange));
- if (isset($pieces[0]) && isset($pieces[1]) && IpUtils::isIp($pieces[0]) && IpUtils::isIp($pieces[1])) {
- $firstIp = $ip = ip2long($pieces[0]);
- $lastIp = ip2long($pieces[1]);
- while ($ip <= $lastIp) {
- $ips[] = long2ip($ip);
- $ip++;
- }
- } elseif (isset($pieces[0]) && IpUtils::isIp($pieces[0])) {
- $ips[] = $pieces[0];
- }
- return $ips;
- }
- /**
- * @param string $ip
- *
- * @return boolean
- */
- public static function isIp($ip)
- {
- if (strpos($ip, '/') !== false) {
- $pieces = explode('/', $ip);
- $ip = $pieces[0];
- }
- return filter_var($ip, FILTER_VALIDATE_IP);
- }
- }
|