Referer in PHP ermitteln

Lesezeit: 4 Minuten

Referer in PHP ermitteln
UnkwnTech

Was ist der zuverlässigste und sicherste Weg, um festzustellen, welche Seite die aktuelle Seite entweder gesendet oder (über AJAX) aufgerufen hat. Ich möchte die nicht verwenden $_SERVER['HTTP_REFERER']wegen der (mangelnden) Zuverlässigkeit, und ich möchte, dass die aufgerufene Seite nur von Anfragen stammt, die von meiner Website stammen.

Bearbeiten: Ich möchte überprüfen, ob ein Skript, das eine Reihe von Aktionen ausführt, von einer Seite auf meiner Website aufgerufen wird.

  • Warum sagst du $_SERVER[‘HTTP_REFERER’] ist nicht zuverlässig?

    – Milan Babuškov

    3. Oktober 2008 um 7:21 Uhr

  • Die PHP-Implementierung ist zuverlässig. Das Problem ist, dass dies nicht von jedem Browser gesendet wird, und Sie können es sogar ändern, wenn Sie möchten. Es ist also nicht zuverlässig, dass es von der Seite des Clients korrekt ist.

    – Biri

    3. Oktober 2008 um 7:23 Uhr

  • Eine Möglichkeit besteht darin, einen eindeutigen Schlüssel (z. B. eine GUID) in ein Feld Ihrer Seite einzufügen und ihn bei der nächsten Anfrage zurückzusenden.

    – Philho

    3. Oktober 2008 um 12:49 Uhr

  • Finden Sie die IP-Adresse des Servers heraus und verwenden Sie sie $_SERVER[REMOTE_ADDR].

    Benutzer835886

    8. Juli 2011 um 18:24 Uhr


Der REFERER wird vom Browser des Clients als Teil des HTTP-Protokolls gesendet und ist daher tatsächlich unzuverlässig. Es könnte nicht da sein, es könnte gefälscht sein, Sie können ihm einfach nicht vertrauen, wenn es aus Sicherheitsgründen ist.

Wenn Sie überprüfen möchten, ob eine Anfrage von Ihrer Website kommt, können Sie das nicht, aber Sie können überprüfen, ob der Benutzer Ihre Website besucht hat und/oder authentifiziert ist. Cookies werden in AJAX-Anfragen gesendet, sodass Sie sich darauf verlassen können.

  • Wenn Sie diese Methode verwenden möchten, sollten Sie trotzdem den Referrer überprüfen, um CSRF zu verhindern en.wikipedia.org/wiki/Cross-site_request_forgery

    – JD Isaacks

    13. September 2010 um 14:15 Uhr

  • Idealerweise sollten Sie ein eindeutiges Token pro Sitzung und Benutzer (pro Anfrage, wenn Sie paranoid sind) verwenden, um CSRF-Angriffe zu verhindern. Die Überprüfung des Referrers ist nur Sicherheit durch Verschleierung und keine wirkliche Lösung.

    – Seldaek

    30. Dezember 2010 um 20:05 Uhr

  • @Seldaek nein, die Überprüfung des Referers ist keine “Sicherheit durch Verschleierung”. Ein Angreifer, der versucht, einen CSRF-Angriff durchzuführen, kann den vom Browser des Opfers gesendeten Referrer nicht kontrollieren und überprüft ihn daher tut vor CSRF schützen. Ich bleibe jedoch bei Ihrer Schlussfolgerung, dass Sie stattdessen ein CSRF-Token verwenden sollten, da der Referrer-Checking-Ansatz dies getan hat Nachteile Dazu gehört, dass Sie angreifbar werden, wenn Sie eine offene Weiterleitung auf Ihrer Website haben, und nach Benutzeragenten suchen, die den Referrer entfernen.

    – Mark Amery

    19. Mai 2014 um 22:50 Uhr

  • @MarkAmery, es hängt natürlich alles davon ab, wogegen Sie sich zu verteidigen versuchen, aber die Verwendung von clientspezifischen HTTP-Headern ist insgesamt kein sehr starkes Sicherheitsmodell.

    – Seldaek

    20. Mai 2014 um 7:00 Uhr

Referer in PHP ermitteln
Wir0

Was ich am besten gefunden habe, ist ein CSRF-Token und speichere es in der Sitzung für Links, bei denen Sie den Referrer überprüfen müssen.

Wenn Sie also einen FB-Callback generieren, sieht das ungefähr so ​​​​aus:

$token = uniqid(mt_rand(), TRUE);
$_SESSION['token'] = $token;
$url = "http://example.com/index.php?token={$token}";

Dann sieht die index.php so aus:

if(empty($_GET['token']) || $_GET['token'] !== $_SESSION['token'])
{
    show_404();
} 

//Continue with the rest of code

Ich kenne sichere Websites, die das Äquivalent für alle ihre sicheren Seiten tun.

  • Hier ist ein Link für weitere Informationen zu CSRF-Token: en.wikipedia.org/wiki/Cross-site_request_forgery

    – Mi0

    4. Dezember 2012 um 13:20 Uhr


  • Sind Sie sicher, dass es so ist? $_GET['token'] == $_SESSION['token'] und nicht $_GET['token'] !== $_SESSION['token']?

    – Timo Huovinen

    19. Februar 2014 um 9:27 Uhr

Verwenden $_SERVER[‘HTTP_REFERER’]

Die Adresse der Seite (falls vorhanden), die den Benutzeragenten auf die aktuelle Seite verwiesen hat. Dies wird vom Benutzeragenten festgelegt. Nicht alle Benutzeragenten werden dies festlegen, und einige bieten die Möglichkeit, HTTP_REFERER als Funktion zu ändern. Kurz gesagt, es kann nicht wirklich vertraut werden.

if (!empty($_SERVER['HTTP_REFERER'])) {
    header("Location: " . $_SERVER['HTTP_REFERER']);
} else {
    header("Location: index.php");
}
exit;

Es gibt keine zuverlässige Möglichkeit, dies zu überprüfen. Es ist wirklich unter der Hand des Kunden, Ihnen zu sagen, woher es kam. Sie könnten sich vorstellen, Cookie- oder Sitzungsinformationen nur auf einigen Seiten Ihrer Website zu verwenden, aber dies würde die Benutzererfahrung mit Lesezeichen beeinträchtigen.

Wir haben nur noch eine einzige Option, nachdem wir alle gefälschten Referrer-Probleme gelesen haben: dh die Seite, die wir als Referrer verfolgen möchten, sollte in der Sitzung gehalten werden, und als Ajax aufgerufen werden, dann in der Sitzung prüfen, ob sie einen Referrer-Seitenwert hat, und die Aktion andernfalls nein ausführen Aktion.

Wenn er andererseits eine andere Seite anfordert, setzen Sie den Referrer-Sitzungswert auf null.

Denken Sie daran, dass die Sitzungsvariable nur auf die gewünschte Seitenanforderung gesetzt wird.

988350cookie-checkReferer in PHP ermitteln

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy