Regulärer Ausdruck, um zu prüfen, ob eine Url auf localhost verweist

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Regulärer Ausdruck, um zu prüfen, ob eine Url auf localhost verweist

    Hallo,

    ich möchte mittel Regulärer Ausdrücke prüfen, ob eine URL auf localhost verweist.
    Habe mir dazu folgende zwei Regulären Ausdrücke gebastelt:

    PHP-Code:
    "/\A(http:\/\/localhost)/i" und "/\A(http:\/\/)?127.(\d){1,3}.(\d){1,3}.(\d){1,3}/i" 
    Funktioniert soweit ganz gut, allerdings will ich nun noch auschließen, dass es sich dabei um eine Subdomain handelt.

    z.B. wird Confixx nach obigem erstem Ausdruck erkannt, obwohl diese ja nicht wirklich auf localhost verweist.

    Mein Ansatz ist nun zu verbieten, dass auf obige Ausdrücke ein Punkt folgt. Und da scheitert es.

    Habe versucht es mit
    PHP-Code:
    "[^\.]{1}" 
    zu lösen, jedoch ohne Erfolg:

    PHP-Code:
    "/\A(http:\/\/localhost)[^\.]{1}/i" bzw"/\A(http:\/\/)?127.(\d){1,3}.(\d){1,3}.(\d){1,3}[^\.]{1}/i" 
    Weiß jemand einen Rat?
    1123581321

  • #2
    PHP-Code:
    $url 'http://localhost/index.php';

    $host parse_url($urlPHP_URL_HOST);
    $ips gethostbynamel($host);

    if (
    is_array($ips) && in_array('127.0.0.1'$ipstrue)) {
        echo 
    'URL verweist auf localhost.';
    } else {
        echo 
    'URL verweist nicht auf localhost.';

    Kommentar


    • #3
      Super. Danke.
      Hab es noch etwas modifziert, damit auf alle IP Addressen im Bereich von 127.0.0.1 – 127.255.255.254 geprüft werden, und damit auch urls welche nicht mit http:// beginnen funktionieren.
      Hier der fertige Code:

      PHP-Code:
      function is_localhost($url) {
          
          
      $url '127.255.255.1/index.php';
          
          
      preg_match("/\A(http:\/\/)/"$url$matches);
          if(
      sizeof($matches) == 0)
              
      $url 'http://'.$url;

          
      $host parse_url($urlPHP_URL_HOST);
          
      $ips gethostbynamel($host);
          
          foreach(
      $ips as $item) {
          
              
      $ip_ar explode("."$item);
              if(
      $ip_ar[0] == 127 && $ip_ar[3] != 255)
                  return 
      1;
          
          }
          return 
      0;


      1123581321

      Kommentar


      • #4
        Deine Funktion erlaubt auch kein 127.0.0.255. Außerdem solltest du TRUE oder FALSE zurückgeben und nicht 1 und 0.

        PHP-Code:
        function is_local_host($hostname) {
            
        $ips gethostbynamel($hostname);

            if (
        is_array($ips)) {
                foreach (
        $ips as $ip) {
                    
        $long ip2long($ip);
                    if (
        $long 0x7F000000 && $long 0x7FFFFFFF) {
                        return 
        true;
                    }
                }
            }

            return 
        false;
        }

        $url 'http://127.0.0.1/index.php';
        $host parse_url($urlPHP_URL_HOST);

        if (
        is_local_host($host)) {
            echo 
        'URL verweist auf einen lokalen Host.';
        } else {
            echo 
        'URL verweist auf keinen lokalen Host.';

        Zuletzt geändert von h3ll; 16.09.2013, 18:53.

        Kommentar


        • #5
          Hoppla, du hast Recht.
          Danke für deine Lösung.

          Dennoch würde mich immernoch interessieren, was an obigen Regulären Ausdrücken nicht stimmt?
          1123581321

          Kommentar


          • #6
            Zitat von h3ll Beitrag anzeigen
            Deine Funktion erlaubt auch kein 127.0.0.255.

            PHP-Code:
            function is_local_host($hostname) {
                
            $ips gethostbynamel($hostname);

                if (
            is_array($ips)) {
                    foreach (
            $ips as $ip) {
                        
            $long ip2long($ip);
                        if (
            $long 0x7F000000 && $long 0x7FFFFFFF) {
            // ... 
            Besser wäre vermutlich $long <= 0x7fffffff, da sonst deine Funktion auch an 127.255.255.255 scheitert.

            Zitat von Enerkin Beitrag anzeigen
            Dennoch würde mich immernoch interessieren, was an obigen Regulären Ausdrücken nicht stimmt?
            Nichts, da du keine verwendet hast. Das bisschen Pattern-Matching fürs suchen von "http://" am String-Anfang hätte man auch mit den gewöhnlichen String-Funktionen von PHP hinbekommen.

            Zitat von Enerkin Beitrag anzeigen
            Dennoch würde mich immernoch interessieren, was ... nicht stimmt?
            Keine Ahnung, ob deine Lösung mit 127.0.0.255 funktioniert, kannst du ja prima selber ausprobieren.

            Aber was ist mit:
            Code:
            ::1
            ::FFFF:127.0.0.1
            ::FFFF:7F00:001
            Sind das keine Loopback-Adressen, die man in Betracht ziehen sollte?
            Oder stellst du durch die Verwendung von parse_url() sicher, dass eine IPv6-Adresse das Script schon vorher abbrechen lässt?
            Zuletzt geändert von fireweasel; 17.09.2013, 19:41.
            Klingon function calls do not have “parameters”‒they have “arguments”‒and they always win them!

            Kommentar


            • #7
              Zitat von fireweasel Beitrag anzeigen
              Besser wäre vermutlich $long <= 0x7fffffff, da sonst deine Funktion auch an 127.255.255.255 scheitert.
              War ja so gewünscht.

              Kommentar


              • #8
                Zitat von fireweasel Beitrag anzeigen
                Besser wäre vermutlich $long <= 0x7fffffff, da sonst deine Funktion auch an 127.255.255.255 scheitert.
                Wikipedia: In der Regel ist jede der Adressen von 127.0.0.1 bis 127.255.255.254 (127.0.0.0/8 Subnetz) als Loopback-Device verwendbar.


                Nichts, da du keine verwendet hast. Das bisschen Pattern-Matching fürs suchen von "http://" am String-Anfang hätte man auch mit den gewöhnlichen String-Funktionen von PHP hinbekommen.
                Sorry, aber das da oben sind eindeutig reguläre Ausdrücke. Und dass es mit String-Funktionen umständlicher geht bezweifelt keiner.

                Mir geht es jetzt auch gar nicht darum, wie man obiges IP Problem mit regulären Ausdrücken löst.
                Ich will nun lediglich wissen, wie man bei einem regulären Ausdruck ein bestimmtes Zeichen an einer bestimmten Stelle verbietet.

                Keine Ahnung, ob deine Lösung mit 127.0.0.255 funktioniert, kannst du ja prima selber ausprobieren.
                Dass meine obige Lösung nicht funktioniert sieht man doch.

                Aber was ist mit:
                Code:
                ::1
                ::FFFF:127.0.0.1
                ::FFFF:7F00:001
                Sind das keine Loopback-Adressen, die man in Betracht ziehen sollte?
                Oder stellst du durch die Verwendung von parse_url() sicher, dass eine IPv6-Adresse das Script schon vorher abbrechen lässt?
                Hab jetzt mal obige Adressen in meine Adresszeilen getippt. Keine davon hat mich zu meinem lokalen Webserver geführt.
                1123581321

                Kommentar


                • #9
                  Was du suchst, ist eine negative lookahead assertion.
                  PHP: Assertions - Manual
                  I don't believe in rebirth. Actually, I never did in my whole lives.

                  Kommentar


                  • #10
                    Zitat von wahsaga Beitrag anzeigen
                    Was du suchst, ist eine negative lookahead assertion.
                    PHP: Assertions - Manual
                    Danke.

                    Bekomm es immernoch nicht hin:
                    PHP-Code:
                    preg_match("/\A(http:\/\/)?127.(\d){1,3}.(\d){1,3}.(\d){1,3}(?!\.)/i""127.00.235.253.de"$output_array); 
                    $output_array:
                    PHP-Code:
                    Array
                    (
                        [
                    0] => 127.00.235.25
                        
                    [1] => 
                        [
                    2] => 0
                        
                    [3] => 5
                        
                    [4] => 5

                    1123581321

                    Kommentar


                    • #11
                      Hi,
                      ich frag' jetzt mal so aus Neugier, worauf das Ganze hinauslaufen bzw. wozu das gut sein soll?
                      Titel der Frage ist doch: Regulärer Ausdruck, um zu prüfen, ob eine Url auf localhost verweist

                      Wenn man bei der ganzen Fummelei mit parse_url und gethostbynamel und regulärem Ausdruck als Adresse immer auf
                      $url = '127.0.0.1/index.php'; oder $url = 'http://localhost/index.php'; prüft, ist doch wohl klar,
                      dass man zu einem richtigen Ergebnis kommt. Was gibts denn da noch zu prüfen?

                      Localhost ist der Default-Name des Loopbackadapters eines jeden Rechners, und 127.0.0.1 seine Default-IP-Adresse.
                      Bei einem Aufruf von localhost antwortet immer das eigene System, genau wie bei ping auf localhost.

                      Bei einem Aufruf www.meinedomain.de antwortet das System, an das die Anfrage gerichtet ist. Für sich gesehen
                      greift das entfernte System natürlich auf seine lokalen Resourcen, eben auf Localhost zu.
                      Läuft dort eine Datenbankanwendung, dann ist es sogar wahrscheinlich, dass in den Scripten als host eben localhost verwendet wird.

                      Das heißt aber nicht, dass man dieses entfernte System mit http://localhost/index.php erreichen kann.

                      Das Ergebnis einer Prüfung der Adressen 127.0.0.1/index.php oder localhost/index.php, ob eine URL auf localhost verweist,
                      sagt mir also nichts anderes als das, was ich sowieso schon weiß. Gebe ich eine solche Adresse ein, verweist diese auf mein System.

                      Gruß
                      Günni

                      Kommentar

                      Lädt...
                      X