Simone: URL Valid ?

HI,

Ich möchte prüfen ob ein Benutzer eine "richtige" URL angegeben hat.

Ich habe dazu eine kleine Funktion geschrieben.
Hauptbestandteil ist gethostbyname()

Wie sicher arbeitet gethostbyname() ???

Simone

  1. hi,

    Ich möchte prüfen ob ein Benutzer eine "richtige" URL angegeben hat.

    Definiere "richtig".

    Im Titel war von "valide" die Rede - möchtest du also zunächst mal auf syntaktische Korrektheit prüfen?

    Ich habe dazu eine kleine Funktion geschrieben.
    Hauptbestandteil ist gethostbyname()

    Wie sicher arbeitet gethostbyname() ???

    Definiere "sicher".

    Die Funktion wird vermutlich schon eine DNS-Abfrage machen, so dass wenn sie eine IP zurückliefert, der Domainname schon mal existent sein sollte.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hallo Wahsaga

      Ich stelle mal die Funktion hier rein.

      Ausgangssituation:
      verboten: Subdomain
      verboten: Verzeichnisse

      erlaubt: (Www.)domain(.Endung)

      function valid_url($url,$linktxt)
      {
       if (strlen($url) < 10)
       {
        return ("$linktxt: die URL [ $url ] erscheint ungültig!");
       }
       $chek =true;
       $ip_t = $_SERVER["SERVER_ADDR"];
       preg_match_all("/http://([^?|&|/]*)/i", $url, $temp);
       $url_host_org = $temp[1][0];
       preg_match_all("/([a-zA-Z-1234567890]+.[a-zA-Z-1234567890]+)/?$/i", $url_host_org, $temp);
       $url_domain = $temp[1][0];
       $url_host =  eregi_replace('www.','',$url_host_org);
       $ip = gethostbyname($url_host_org);
       if (!ereg("^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})+$" , $ip, $regs))
       {
        $fehler.="$linktxt: Fehler beim auflösen der URL! > $url_host_org<br>";
        $chek =false;
       }
       if($ip  == $ip_t)
       {
        $fehler.="$linktxt: Die IP kann nicht aufgelöst werden! > $url<br>";
        $chek =false;
       }
       if ($url_host != $url_domain)
       {
        $fehler.="$linktxt: Fehler Subdomain! > ".@preg_replace("=($url_domain)=i", "<b>\1</b>", $url_host_org)."<br>";
        $chek =false;
       }
       if ($chek == false);
       {
        return $fehler;
       }
      }

      1. Hallo,

        if (!ereg("^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})+$" , $ip, $regs))

        Du hälst also eine IP-Adresse "333.780.000.1" für zulässig? Ich wäre mir da nicht so sicher...
        Zu Deiner ursprünglichen Fragen:

        Wie sicher arbeitet gethostbyname()

        Diese Funktion ist für Deine Zwecke absolut ungeeignet. Verwende dns_get_record() und prüfe mit empty()

        Gruß aus Berlin!
        eddi

        1. Hallo eddi,

          if (!ereg("^([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3}).([0-9]{1,3})+$" , $ip, $regs))

          Du hälst also eine IP-Adresse "333.780.000.1" für zulässig? Ich wäre mir da nicht so sicher...

          Wie sieht aus deiner Sicht ein besseres Muster aus?

          dns_get_record() = php5

          Hab ich nicht, schade!
          Gibt es was für Php4 ?

          Simone

          1. Re:

            Wie sieht aus deiner Sicht ein besseres Muster aus?

            [link:http://de3.php.net/manual/de/language.functions.php@title=function] is_ipv4($ip){  
                    # bestimmt, ob $ip eine IP-Adresse bezeichnet  
                    $ip=[link:http://de3.php.net/manual/de/function.explode.php@title=explode]('.',$ip);  
                    [link:http://de3.php.net/manual/de/language.control-structures.php#control-structures.if@title=if]([link:http://de3.php.net/manual/de/function.count.php@title=count]($ip)!=4)  
                            [link:http://de3.php.net/manual/de/function.return.php@title=return](FALSE);  
              
                    [link:http://de3.php.net/manual/de/control-structures.for.php@title=for]($i=0;$i<4;$i++){  
                            $x=[link:http://de3.php.net/manual/de/function.strlen.php@title=strlen]($ip[$i]);  
              
                            if(strlen([link:http://de3.php.net/manual/de/function.decbin.php@title=decbin]($ip[$i]))>8 || ($ip[$i]{0}==0 && $x>1))  
                                    return(FALSE);  
              
                            for($j=0;$j<$x;$j++){  
                                    for($k=0;$k<10;$k++)  
                                            if([link:http://de3.php.net/manual/de/function.strval.php@title=strval]($ip[$i]{$j})===strval($k))  
                                                    [link:http://de3.php.net/manual/de/control-structures.break.php@title=break];  
              
                                    if($k==10)      return(FALSE);  
                            }  
                    }  
                    return(TRUE);  
            }
            

            Und im Übrigen scheinst Du die Funktion parse_url nicht zu kennen, weil Du mit RegEx die Sache angegangen bist.

            Gruß aus Berlin!
            eddi

            1. gudn tach!

              Wie sieht aus deiner Sicht ein besseres Muster aus?

              [code-monster]

              macht aber afais nichts grossartig anderes als der folgende, kuerzere und imho huebschere, oder?

              $ipp='(?:2[5][0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)';  
              preg_match("/^$ipp\.$ipp\.$ipp\.$ipp$/", $ip);
              

              man koennte sich allerdings noch ueberlegen, ob man wirklich alle ip-adressen zulassen moechte.

              prost
              seth

              1. Moin Seth,

                $ipp='(?:2[5][0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)';

                preg_match("/^$ipp.$ipp.$ipp.$ipp$/", $ip);

                  
                Sauerei; und ich habe wieder kein Modul mit Perl-kompatiblen RegEx am Start, um zu testen ;(  
                  
                  
                Gruß aus Berlin!  
                eddi  
                
                -- 
                PHP: [PHP unter Linux installieren](http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP:_Installation#UNIX-artige_Systeme), in Bearbeitung [PHP Konfigurieren](http://de.wikibooks.org/wiki/Websiteentwicklung:_PHP:_Konfiguration)  
                  
                ![](http://212.227.99.60/gentoo.jpg)
                
                1. gudn tach eddi!

                  $ipp='(?:2[5][0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)';
                  preg_match("/^$ipp\.$ipp\.$ipp\.$ipp$/", $ip);

                  Sauerei; und ich habe wieder kein Modul mit Perl-kompatiblen RegEx am Start, um zu testen ;(

                  dann poste den code, ich teste ihn und praesentiere dann die ergebnisse. du kannst mir ruhig vertrauen *haende_reib*.

                  prost
                  seth

                2. Hallo eddi.

                  $ipp='(?:2[5][0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)';

                  preg_match("/^$ipp.$ipp.$ipp.$ipp$/", $ip);

                  
                  >   
                  > Sauerei; und ich habe wieder kein Modul mit Perl-kompatiblen RegEx am Start, um zu testen ;(  
                    
                  [Evaluator](http://pcre.nophia.de/evaluate/index.php) anyone?  
                    
                    
                  Einen schönen Donnerstag noch.  
                    
                  Gruß, Ashura  
                  
                  -- 
                  sh:( fo:} ch:? rl:( br: n4:~ ie:{ mo:| va:) de:> zu:} fl:( ss:) ls:[ js:|  
                  „It is required that HTML be a common language between all platforms. This implies no device-specific markup, or anything which requires control over fonts or colors, for example. This is in keeping with the SGML ideal.“  
                  [[HTML Design Constraints: Logical Markup](http://www.w3.org/History/19921103-hypertext/hypertext/WWW/MarkUp/HTMLConstraints.html)]
                  
                  1. gudn tach!

                    Sauerei; und ich habe wieder kein Modul mit Perl-kompatiblen RegEx am Start, um zu testen ;(

                    Evaluator anyone?

                    ach so, ich vermutete, eddi meine einen benchmark-test.

                    prost
                    seth

              2. HI,

                Dein Reg_ex sieht auf den ersten Blick ganz gut aus.
                Dank Dir!!!!
                Ich werde die ganze Sache mal testen!
                Simone

            2. HI,
              eddi
              Danke für Deine Antwort!
              ..
              Und im Übrigen scheinst Du die Funktion parse_url nicht zu kennen, weil Du mit RegEx die Sache angegangen bist...

              Das Problem bei parse_url ist das Subdomains als [host] behandelt werden .
              Was Imo nicht der Aufgabensituation entspricht!
              keine Subdomains.
              keine Verzeichnisse.

              Simone

              1. Hallo,

                $ php -r 'print_r(parse_url("http://eddi.to-grip.de/web/"));'
                Array
                (
                    [scheme] => http
                    [host] => eddi.to-grip.de
                    [path] => /web/
                )
                $ php -r 'print_r(parse_url("http://susi.eddi.to-grip.de/web/"));'
                Array
                (
                    [scheme] => http
                    [host] => susi.eddi.to-grip.de
                    [path] => /web/
                )

                Das Problem bei parse_url ist das Subdomains als [host] behandelt werden .

                Dir ist aber klar, daß das absolut korrekt so ist und Du mit Deiner Filtrung Leute mit Subdomains, wie die von z. B. no-ip.com, damit vergretzt?
                Seisdrum:

                if(count(explode('.',$parse_url_ausgabe['host']))>2) echo "Du bist hier nicht erwünscht";

                Gruß aus Berlin!
                eddi