Пример #1
0
 /**
  * Expects an array of items. The items are either IPs or IPs separated by comma, space or tab. Or an array of IP's.
  * We then examine all IP's looking for a public IP and storing private IP's in an array. If we find no public IPs we return the first private addr we found.
  *
  * @param array $arr
  * @return bool|mixed
  */
 private function _getCleanIPAndServerVar($arr)
 {
     $privates = array();
     //Store private addrs until end as last resort.
     foreach ($arr as $entry) {
         list($item, $var) = $entry;
         if (is_array($item)) {
             foreach ($item as $j) {
                 // try verifying the IP is valid before stripping the port off
                 if (!$this->_isValidIP($j)) {
                     $j = preg_replace('/:\\d+$/', '', $j);
                     //Strip off port
                 }
                 if ($this->_isValidIP($j)) {
                     if ($this->_isIPv6MappedIPv4($j)) {
                         $j = wfWAFUtils::inet_ntop(wfWAFUtils::inet_pton($j));
                     }
                     if ($this->_isPrivateIP($j)) {
                         $privates[] = array($j, $var);
                     } else {
                         return array($j, $var);
                     }
                 }
             }
             continue;
             //This was an array so we can skip to the next item
         }
         $skipToNext = false;
         foreach (array(',', ' ', "\t") as $char) {
             if (strpos($item, $char) !== false) {
                 $sp = explode($char, $item);
                 foreach ($sp as $j) {
                     $j = trim($j);
                     if (!$this->_isValidIP($j)) {
                         $j = preg_replace('/:\\d+$/', '', $j);
                         //Strip off port
                     }
                     if ($this->_isValidIP($j)) {
                         if ($this->_isIPv6MappedIPv4($j)) {
                             $j = wfWAFUtils::inet_ntop(wfWAFUtils::inet_pton($j));
                         }
                         if ($this->_isPrivateIP($j)) {
                             $privates[] = array($j, $var);
                         } else {
                             return array($j, $var);
                         }
                     }
                 }
                 $skipToNext = true;
                 break;
             }
         }
         if ($skipToNext) {
             continue;
         }
         //Skip to next item because this one had a comma, space or tab so was delimited and we didn't find anything.
         if (!$this->_isValidIP($item)) {
             $item = preg_replace('/:\\d+$/', '', $item);
             //Strip off port
         }
         if ($this->_isValidIP($item)) {
             if ($this->_isIPv6MappedIPv4($item)) {
                 $item = wfWAFUtils::inet_ntop(wfWAFUtils::inet_pton($item));
             }
             if ($this->_isPrivateIP($item)) {
                 $privates[] = array($item, $var);
             } else {
                 return array($item, $var);
             }
         }
     }
     if (sizeof($privates) > 0) {
         return $privates[0];
         //Return the first private we found so that we respect the order the IP's were passed to this function.
     }
     return false;
 }