Sanne: wie den Referer filtern

Hallo miteinander,

ich gebe auf meiner Seite den Referer wie folgt aus:

$test = $_SERVER["HTTP_REFERER"];
print $test;

Nun möchte ich nicht die gesamte Adresse angeben, sondern nur die jeweilige domain plus Endung.

Also statt:

http://www.selfhtml.org/1.Unterseite/2.Unterseite/usw
oder
http://selfhtml.org/1.Unterseite/2.Unterseite/usw

nur:

selfhtml.org

ohne http://
     http://www.
und  die Unterseiten.

Welche Zeichenkette ist dafür notwendig?

Liebe Grüsse Sanne

  1. Hi,

    ich gebe auf meiner Seite den Referer wie folgt aus:

    $test = $_SERVER["HTTP_REFERER"];
    print $test;

    Informiere dich über kontextgerechte Kodierung von Werten vor der Ausgabe - so ist das eine XSS-Lücke.

    Nun möchte ich nicht die gesamte Adresse angeben, sondern nur die jeweilige domain plus Endung.

    Welche Zeichenkette ist dafür notwendig?

    Die Zeichenkette hast du schon - du suchst Funktionen zu ihrer Bearbeitung.

    parse_url liefert dir den Hostnamen - nur um die Entfernung von "www." oder ähnlichem musst du dich dann noch selber kümmern. Und dazu schaust du dir erst mal die Zeichenkettenfunktionen an, die PHP so bietet.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
  2. Hi,

    $test = $_SERVER["HTTP_REFERER"];
    print $test;

    Zusätzlich zu ChrisBs Anmerkungen:

    Diese Variable kann *irgendeinen* String enthalten. Das kann (irgend)ein URL sein, aber auch sonstwas oder ein Leerstring. Es kann auch sein, daß diese Variable überhaupt nicht existiert.

    Gruß, Cybaer

    --
    Zweck des Disputs oder der Diskussion soll nicht der Sieg, sondern der Gewinn sein.
    (Joseph Joubert, Schriftsteller)
  3. Hallo miteinander,

    ich habe jetzt folgendes ergänzt:

    $test = $_SERVER["HTTP_REFERER"];
    $array = parse_url($test);
    echo $array[host];

    Dieses entfernt alle Unterseiten und das http://

    Was mir noch fehlt, ist es, das www. zu entfernen, damit nur noch domain.com statt www.domain.com wiedergegeben wird.

    Was muss ich da noch ergänzen, um das www. zu entfernen????
    Bitte nicht wieder auf eine allgemeine Seite verweisen.

    Vielen Dank für eure Mühe

    Gruss Sanne

    1. hi,

      Was muss ich da noch ergänzen, um das www. zu entfernen????

      Ungetestet, da gerade kein Server zur Hand.

      if(strpos($array[host], 'www.') !== false)  
        $array[host] = str_replace('www.', '', $array[host]);
      

      Bitte nicht wieder auf eine allgemeine Seite verweisen.

      Wenn du das für den richtigen Ansatz hältst -- ich mach's trotzdem (dafür direkt auf's Manual statt auf irgendwelche allgemeinen Seiten).

      http://de3.php.net/function.strpos
      http://php.net/manual/en/function.str-replace.php

      mfg

      --
      echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
      array(2) {
        ["SELFCODE"]=>
        string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
        ["Meaningful"]=>
        string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
      }
      1. Hello,

        if(strpos($array[host], 'www.') !== false)

        $array[host] = str_replace('www.', '', $array[host]);

          
        Wenn man ganz mutig ist, könnte aich ein  
          
          $domainparts = explode('www.',$array[host],1)  
          echo $domainparts[0];  
          
        funktionieren :-)  
        Das ist nicht unsicherer als Dein Code.  
        Denn genau genommen müsste Dein Code auch heißen:  
          
        ~~~php
          
          
          if(strpos($array[host], 'www.') === 0)      ## wenn 'www.' am Anfang des Strings steht  
          {  
              $array[host] = substr($array[host],4);  ## String erst ab der Postition 4 übernehmen  
          }                                           ## Zählung beginnt bei 0  
          
        
        

        Liebe Grüße aus dem schönen Oberharz

        Tom vom Berg

        --
        Nur selber lernen macht schlau
        http://bergpost.annerschbarrich.de
        1. hi,

          Denn genau genommen müsste Dein Code auch heißen:

          Solange wir ohne Regex auskommen, passt nahezu alles ;)

          mfg

          --
          echo '<pre>'; var_dump($Malcolm_Beck`s); echo '</pre>';
          array(2) {
            ["SELFCODE"]=>
            string(74) "ie:( fl:) br:> va:? ls:? fo:) rl:| n4:# ss:{ de:? js:} ch:? sh:( mo:? zu:("
            ["Meaningful"]=>
            string(?) "Der Sinn des Lebens ist deinem Leben einen Sinn zu geben"
          }
      2. hi Malcolm Beck´s,

        danke, danke, danke,

        hat super geklappt !!!

        Ich mache das hier nur nebenbei, und wollte nicht gleich einen PHP - Kurs belegen.

        Gruss Sanne

        1. Ich mache das hier nur nebenbei, und wollte nicht gleich einen PHP - Kurs belegen.

          Hat auch keiner verlangt - wenn du etwas "nebenbei" machst, kannst du dir "nebenbei" auch Grundwissen aneignen oder zumindest erlernen, wie du dir selbst helfen kannst.

    2. Hi,

      Was muss ich da noch ergänzen, um das www. zu entfernen????
      Bitte nicht wieder auf eine allgemeine Seite verweisen.

      Bitte nicht endlos Code schnorren, sondern mal was *selber* versuchen!

      MfG ChrisB

      --
      Light travels faster than sound - that's why most people appear bright until you hear them speak.
    3. n'abend,

      Was mir noch fehlt, ist es, das www. zu entfernen, damit nur noch domain.com statt www.domain.com wiedergegeben wird.

      Was passiert denn bei dieser Vorgehensweise, wenn du »http://forum.de.selfhtml.org/?t=187619&m=1247573« als Referer bekommst? Richtig, da gibt's gar kein "www.".

      Du willst die Base-Domain haben. Und die haben in aller Regel das Schema »basedomain.tld«.

      Nehmen wir als Beispiel mal eine ganze reihe URLs, die du als Referer bekommen könntest als Ausgangsbasis für unseren Test:

      '' => null, // kann ja leer sein
        'hallo welt' => null // kann gar keine valide URL sein
        'google.de' => null // nur Domain
        'subdomain.google.de' => null // nur Subdomain
        'http://google.de' => 'google.de' // nur Protokoll und Domain
        'http://intranet' => 'intranet' // "eigene" domains innerhalb eines intranets
        'http://www.google.de' => 'google.de' // www-Subdomain
        'http://www.google.de/advanced_search?hl=de' => 'google.de' // www-Subdomain und Pfad und QueryString
        'http://forum.de.selfhtml.org/my' => 'selfhtml.org' // "ungewöhnliche" Subdomain
        'http://google.de/?ein=querystring' => 'google.de' // QueryString
        'http://google.de/?ein=querystring#fragment' => 'google.de' // Fragment
        'https://www.google.de' => 'google.de' // anderes Protokoll

      Schema: URL => erwartetes Ergebnis // Erläuterung

      Wir wollen für alle obigen Elemente die entsprechende Base-Domain haben. Wir wissen bereits, dass parse_url() eine URL in seine Bestandteile aufbröseln kann, was uns (verdammt komplizierte) RegExe erspart. Vielen Dank. Von parse_url() bekommen wir also die volle Domain herausgefiltert. Wir wissen, dass die Elemente einer Domain durch einen Punkt von einander getrennt werden. DAS ist eigentlich die wichtigste Information. wir können jetzt nämlich die volle Domain anhand der Punkte in Einzelteile auftrennen lassen und uns dann am vorletzten und letzten Element bedienen, um die Base-Domain wieder zusammenzusetzen. Alternativ könnten wir auch den letzten Punkt suchen. Und irgendwie sollten wir auch noch sicherstellen, dass bei Eingabe von Müll kein Müll zurückgegeben wird.

      Was haben wir jetzt gemacht? Wir haben unsere Rahmenbedingungen definiert. Wir haben die Ausgangslage definiert und festgehalten welches Ergebnis wir erwarten. Wir haben uns darüberhinaus überlegt wie wir unnötige Subdomains abtrennen können. Willkommen in der Welt des »Ich habe ein Problem, wie kann ich es lösen?«

      Nachdem wir noch ein bisschen in der PHP-Doku herumgestöbert haben, könnten wir die folgenden Test basteln:

      <?php  
        
      $referers = array(  
        '' => null, // kann ja leer sein  
        'hallo welt' => null, // kann gar keine valide URL sein  
        'google.de' => null, // nur Domain  
        'subdomain.google.de' => null, // nur Subdomain  
        'http://google.de' => 'google.de', // nur Protokoll und Domain  
        'http://intranet' => 'intranet', // "eigene" domains innerhalb eines intranets  
        'http://www.google.de' => 'google.de', // www-Subdomain  
        'http://www.google.de/advanced_search?hl=de' => 'google.de', // www-Subdomain und Pfad und QueryString  
        'http://forum.de.selfhtml.org/my' => 'selfhtml.org', // "ungewöhnliche" Subdomain  
        'http://google.de/?ein=querystring' => 'google.de', // QueryString  
        'http://google.de/?ein=querystring#fragment' => 'google.de', // Fragment  
        'https://www.google.de' => 'google.de', // anderes Protokoll  
      );  
        
      /**  
       * Retrieve base domain from URL  
       * @param string $url URL to parse  
       * @return string|null determined base domain, or null on failure  
       */  
      function getBaseDomain( $url )  
      {  
        // abort if there's nothing to parse  
        if( empty($url) )  
          return null;  
        
        // retrieve host from URL  
        // FALSE is returned for invalid URLs, since we can identify them, we can surpress the warning thrown in such a case  
        $host = @parse_url( $url, PHP_URL_HOST );  
        
        // abort if URL could not be parsed  
        if( !$host )  
          return null;  
        
        // split host into components  
        $components = explode( '.', $host );  
        $length = count( $components );  
        
        // "intranet" could be a valid domain inside a company's intranet  
        if( $length < 2 )  
          return $host;  
        
        // the last element will be the TLD (top-level domain)  
        // the second last element will be the actual domain name  
        return $components[ $length -2 ] .'.'. $components[ $length -1 ];  
      }  
        
      // test getBaseDomain() on given URLs  
      echo '<table><tr><th>Eingabe</th><th>Ausgabe</th><th>Status</th></tr>';  
      foreach( $referers as $url => $expectedResult )  
      {  
        $baseDomain = getBaseDomain( $url );  
        
        echo '<tr>',  
          '<td>', htmlspecialchars( $url ), '</td>';  
        
        if( $baseDomain )  
          echo '<td>', htmlspecialchars( $baseDomain ), '</td>';  
        else  
          echo '<td><em>nichts</em></td>';  
        
        echo '<td>', ( $baseDomain === $expectedResult ? 'OK' : 'fehlerhaft' ), '</td>',  
          '</tr>';  
      }  
      echo '</table>';  
        
      ?>
      

      Aus diesem Post solltest du folgendes lernen:

      * Ein (großes) Problem kann in viele einzelne Problemchen aufgeteilt werden
       * Du musst die Ausgangssituation kennen
       * Du musst wissen was du erreichen möchtest
       * Du musst in Betracht ziehen, dass es Randbedingungen gibt (keine URL, oder eine invalide URL als Ausgang)
       * Du kennst viele Wege nach Rom, entscheide dich für einen.

      weiterhin schönen abend...

      --
      #selfhtml hat ein Forum?
      sh:( fo:# ch:# rl:| br:> n4:& ie:{ mo:} va:) de:] zu:} fl:( ss:? ls:[ js:|