Verzeichnisstruktur phpBB-3.2.0


Veröffentlicht
06.01.2017

So funktioniert es


Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück

Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

      (Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

IpUtils.php

Zuletzt modifiziert: 09.10.2024, 12:54 - Dateigröße: 3.83 KiB


 001  <?php
 002   
 003  /*
 004   * This file is part of the Symfony package.
 005   *
 006   * (c) Fabien Potencier <fabien@symfony.com>
 007   *
 008   * For the full copyright and license information, please view the LICENSE
 009   * file that was distributed with this source code.
 010   */
 011   
 012  namespace Symfony\Component\HttpFoundation;
 013   
 014  /**
 015   * Http utility functions.
 016   *
 017   * @author Fabien Potencier <fabien@symfony.com>
 018   */
 019  class IpUtils
 020  {
 021      /**
 022       * This class should not be instantiated.
 023       */
 024      private function __construct()
 025      {
 026      }
 027   
 028      /**
 029       * Checks if an IPv4 or IPv6 address is contained in the list of given IPs or subnets.
 030       *
 031       * @param string       $requestIp IP to check
 032       * @param string|array $ips       List of IPs or subnets (can be a string if only a single one)
 033       *
 034       * @return bool Whether the IP is valid
 035       */
 036      public static function checkIp($requestIp, $ips)
 037      {
 038          if (!is_array($ips)) {
 039              $ips = array($ips);
 040          }
 041   
 042          $method = substr_count($requestIp, ':') > 1 ? 'checkIp6' : 'checkIp4';
 043   
 044          foreach ($ips as $ip) {
 045              if (self::$method($requestIp, $ip)) {
 046                  return true;
 047              }
 048          }
 049   
 050          return false;
 051      }
 052   
 053      /**
 054       * Compares two IPv4 addresses.
 055       * In case a subnet is given, it checks if it contains the request IP.
 056       *
 057       * @param string $requestIp IPv4 address to check
 058       * @param string $ip        IPv4 address or subnet in CIDR notation
 059       *
 060       * @return bool Whether the request IP matches the IP, or whether the request IP is within the CIDR subnet
 061       */
 062      public static function checkIp4($requestIp, $ip)
 063      {
 064          if (!filter_var($requestIp, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
 065              return false;
 066          }
 067   
 068          if (false !== strpos($ip, '/')) {
 069              list($address, $netmask) = explode('/', $ip, 2);
 070   
 071              if ($netmask === '0') {
 072                  return filter_var($address, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4);
 073              }
 074   
 075              if ($netmask < 0 || $netmask > 32) {
 076                  return false;
 077              }
 078          } else {
 079              $address = $ip;
 080              $netmask = 32;
 081          }
 082   
 083          return 0 === substr_compare(sprintf('%032b', ip2long($requestIp)), sprintf('%032b', ip2long($address)), 0, $netmask);
 084      }
 085   
 086      /**
 087       * Compares two IPv6 addresses.
 088       * In case a subnet is given, it checks if it contains the request IP.
 089       *
 090       * @author David Soria Parra <dsp at php dot net>
 091       *
 092       * @see https://github.com/dsp/v6tools
 093       *
 094       * @param string $requestIp IPv6 address to check
 095       * @param string $ip        IPv6 address or subnet in CIDR notation
 096       *
 097       * @return bool Whether the IP is valid
 098       *
 099       * @throws \RuntimeException When IPV6 support is not enabled
 100       */
 101      public static function checkIp6($requestIp, $ip)
 102      {
 103          if (!((extension_loaded('sockets') && defined('AF_INET6')) || @inet_pton('::1'))) {
 104              throw new \RuntimeException('Unable to check Ipv6. Check that PHP was not compiled with option "disable-ipv6".');
 105          }
 106   
 107          if (false !== strpos($ip, '/')) {
 108              list($address, $netmask) = explode('/', $ip, 2);
 109   
 110              if ($netmask < 1 || $netmask > 128) {
 111                  return false;
 112              }
 113          } else {
 114              $address = $ip;
 115              $netmask = 128;
 116          }
 117   
 118          $bytesAddr = unpack('n*', @inet_pton($address));
 119          $bytesTest = unpack('n*', @inet_pton($requestIp));
 120   
 121          if (!$bytesAddr || !$bytesTest) {
 122              return false;
 123          }
 124   
 125          for ($i = 1, $ceil = ceil($netmask / 16); $i <= $ceil; ++$i) {
 126              $left = $netmask - 16 * ($i - 1);
 127              $left = ($left <= 16) ? $left : 16;
 128              $mask = ~(0xffff >> $left) & 0xffff;
 129              if (($bytesAddr[$i] & $mask) != ($bytesTest[$i] & $mask)) {
 130                  return false;
 131              }
 132          }
 133   
 134          return true;
 135      }
 136  }
 137