123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121 |
- <?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) {
- IpUtils::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 static 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);
- }
- /**
- *
- * @param string $clientIp
- * @param array $ips
- *
- * @return boolean Retorna TRUE si la ip esta dentro de las ip bloqueadas.
- */
- public static function checkIpDeny($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_DENY ?
- // ej. API_CIDR_DENY = 127.0.0.1, 127.0.0.1-127.0.0.10, 127.0.0.1/24
- if (getenv("API_CIDR_DENY") !== false) {
- $API_CIDR = getenv("API_CIDR_DENY");
- $pieces = array_map('trim', explode(',', $API_CIDR));
- foreach ($pieces as $ip) {
- if (strpos($ip, '-') !== false) {
- IpUtils::getIpRange($ip, $ips);
- } elseif (IpUtils::isIp($ip)) {
- $ips[] = $ip;
- }
- }
- }
- foreach ($ips as $ip) {
- if (trim($clientIp) == trim($ip) || SfIpUtils::checkIp($clientIp, $ip)) {
- return true;
- }
- }
- return false;
- }
- }
|