wie den Referer filtern
Sanne
- php
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
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
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
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
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
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
hi,
Denn genau genommen müsste Dein Code auch heißen:
Solange wir ohne Regex auskommen, passt nahezu alles ;)
mfg
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
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.
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
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...