# HTTP-Header-Feld „Referrer“



## gigalogisch (13. April 2006)

Hallo Leute,

habe mir so eine Art "Loginmöglichkeit von außen" für ein phpBB Board geschrieben. D. h. MEINE Seite überprüft ob ich im Forum schon angemeldet bin, wenn nicht, muss ich auf MEINER Seite meine Logindaten eingeben. Und dann kommts ;-) : Meine Logindaten werden dann an das loginscript von phpBB geschickt, dieses überprüft die Angaben ganz normal - und wenns passt, schickt sie mich wieder auf MEINE Seite zurück.

Damit das geht, habe ich in der login.php vom Board eine kleine Abfrage eingebaut. Und damit das Loginscript von phpBB weiß, woher die Anfrage kommt, habe ich dort mit $_SERVER['HTTP_REFERER'] gearbeitet. Wenn die Überprüfung abgeschlossen ist, wird mit header("Location: $_SERVER['HTTP_REFERER']") wieder auf MEINE Seite zurück weitergeleitet. Somit bekommt der User von dem ganzen Login-Zeug gar nichts mit, er gibt lediglich seine Daten ein und bleibt praktisch auf dieser Seite.

Nun habe ich aber gelesen, dass einige Firewalls und Browser diesen Referer unterbinden.
Meine Frage: Was gibt dann die $_SERVER-Variable aus? Was steht drin?
Denn wenn ich das wüsste, kann ich auf den Fall reagieren und z. B. noch eine Überprüfung einbauen.

danke

Willi


----------



## fanste (14. April 2006)

Eine andere Möglichkeit den Seitennamen zu bekommen, gibt es meines Wissens nach nicht.

Um alle Keys der $_SERVER Variable zu bekommen, genügt ein einfaches

```
print_r($_SERVER);
```


----------



## Gumbo (14. April 2006)

Das HTTP-Header-Feld „Referer“ ist tatsächlich ein Sicherheitsaspekt, der von vielen missachtet wird. Denn er kann dazu gebraucht werden, die Bewegung eines Benutzers gezielt zu verfolgen und so ein Profil von ihm erstellt werden könnte.

Es kann aber dadurch auch dazu kommen, dass sensible Daten versehentlich zugänglich gemacht werden. So nutzen viele Websites PHP-Sitzungen oder ähnliche Techniken, mit denen Benutzer identifiziert/authentifiziert werden. Verlässt man nun aber diese Website und wird der URL mit Sitzungs-ID an den nächsten Webserver übermittelt, könnte diese Information ausgenutzt werden. Fachsprachlich wird dies Session-Hijacking genannt, da eine fremde Sitzung entführt wird.

Daher reicht die PHP-eigene Sitzungsverwaltung für sicherheitsrelevant Bereiche auch eigentlich nicht aus. Doch darum schert sich kaum jemand.


----------



## Sunray (14. April 2006)

Zu all dem kommt noch, dass man Referer ganz einfach "fälschen" kann:

Man nehme 1x Firefox 1.5,  1x Live HTTP Headers plugin.

Dann ruft man deine Seite auf, manipuliert die Anfrage und sendet sie ein zweites mal... voila.


----------



## gigalogisch (14. April 2006)

Hallo,

danke für die Antworten.

Wenn jemand meint, er muss den HTTP-Referer manipulieren, dann soll er das machen - beißt sich ja nur ins eigene Fleisch, denn dann wird eben nicht mehr auf meine Seite weitergeleitet, wo er dann weitermachen könnte, sondern wird zu seiner "angeblichen" Referer-Seite geleitet oder bekommt eine Fehlermeldung. Das soll mein Problem nicht sein.

Ich brauche auch die ganzen zusätzlichen Daten, die ich mit den $_SERVER Variablen rausbekommen könnte, nicht.
Ich möchte eigentlich nur wissen, welchen Wert, die $_SERVER['HTTP_REFERER'] - Variable annimmt, wenn kein Header gesendet wurde (z. B. wegen Firewall) - wenn ich das weiß, kann ich darauf reagieren und leite den User einfach auf die index.php des phpBB-Forums. Ich möchte nur nicht, dass es dann zu unkontrollierten Aktionen kommt...

Danke nochmal 

Willi


----------



## Gumbo (14. April 2006)

Nur von gesetzten HTTP-Header-Feld existiert auch ein $_SERVER-Pendant. Denn jedes HTTP-Header-Feld wird in der $_SERVER-Variable mit dem Präfix „HTTP“ gespeichert. Der Wert des „Accept-Language“-Header-Felds befindet sich beispielsweise in $_SERVER['HTTP_ACCEPT_LANGUAGE'].


----------



## gigalogisch (14. April 2006)

Gumbo hat gesagt.:
			
		

> Nur von gesetzten HTTP-Header-Feld existiert auch ein $_SERVER-Pendant.



D. h. ich kann mit

```
if (!isset($_SERVER['HTTP_REFERER'])) {
  echo "Dein Browser hat keinen Header gesendet"; //oder sonst irgendeine Funktion...
}
```
überprüfen, ob der User-PC den Header zu senden unterbunden hat?

Danke

Willi


----------



## Gumbo (14. April 2006)

Er muss nicht unbedingt unterbunden werden. Denn ein HTTP-Referrer existiert nur dann, wenn ein Webserver oder ein Dokument auf die aktuelle Ressource verwies. Wenn die Ressource jedoch direkt aufgerufen wurde, der URL also manuell aufgerufen wurde, existiert dieser nicht.


----------

