Determinazione del referer in PHP


102

Qual è il modo più affidabile e sicuro per determinare quale pagina ha inviato o chiamato (tramite AJAX) la pagina corrente. Non voglio utilizzare $_SERVER['HTTP_REFERER'], a causa della (mancanza di) affidabilità, e ho bisogno che la pagina che viene chiamata provenga solo da richieste provenienti dal mio sito.

Modifica: sto cercando di verificare che uno script che esegue una serie di azioni venga chiamato da una pagina del mio sito web.


5
Perché dici che $ _SERVER ["HTTP_REFERER"] non è affidabile?
Milan Babuškov

9
L'implementazione PHP è affidabile. Il problema è che nessun browser lo invia e puoi persino modificarlo se lo desideri. Quindi non è affidabile che sia corretto dal lato del cliente.
Biri

2
Un modo possibile è mettere una chiave univoca (es. Un GUID) in un campo della tua pagina e rispedirlo alla richiesta successiva.
PhiLho

Scopri l'indirizzo IP del server e utilizza $_SERVER[REMOTE_ADDR].

Risposte:


93

Il REFERER viene inviato dal browser del client come parte del protocollo HTTP ed è quindi effettivamente inaffidabile. Potrebbe non essere lì, potrebbe essere contraffatto, semplicemente non puoi fidarti se è per motivi di sicurezza.

Se vuoi verificare se una richiesta proviene dal tuo sito, beh non puoi, ma puoi verificare che l'utente sia stato sul tuo sito e / o sia autenticato. I cookie vengono inviati nelle richieste AJAX, quindi puoi fare affidamento su questo.


5
Se desideri utilizzare questo metodo, dovresti comunque controllare anche il referrer per evitare CSRF en.wikipedia.org/wiki/Cross-site_request_forgery
JD Isaacks,

17
Idealmente dovresti usare un token univoco per sessione per utente (per richiesta se sei paranoico) per prevenire attacchi CSRF. Controllare il referrer è solo sicurezza per offuscamento e non è una vera soluzione.
Seldaek

3
@Seldaek no, il controllo del referer non è "sicurezza per offuscamento". Un utente malintenzionato cercando di eseguire un attacco CSRF non può controllare il referer inviato dal browser della vittima, quindi si verifica che non fa la protezione contro CSRF. Tuttavia, manterrò la tua conclusione che dovresti usare invece un token CSRF, poiché l'approccio di controllo dei referer ha degli svantaggi, incluso il lasciarti vulnerabile se hai un reindirizzamento aperto sul tuo sito e l'interruzione per agenti utente che spogliano il referer.
Mark Amery

@MarkAmery, ovviamente tutto dipende da cosa stai cercando di difendere, ma l'utilizzo di intestazioni http specifiche del client non è nel complesso un modello di sicurezza molto forte.
Seldaek

23

Quello che ho trovato migliore è un token CSRF e salvarlo nella sessione per i collegamenti in cui è necessario verificare il referrer.

Quindi, se stai generando un callback FB, sarebbe simile a questo:

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

Quindi index.php avrà questo aspetto:

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

//Continue with the rest of code

Conosco siti sicuri che fanno l'equivalente di questo per tutte le loro pagine protette.


1
Ecco un collegamento per ulteriori informazioni sui token CSRF: en.wikipedia.org/wiki/Cross-site_request_forgery
Me0

7
Sei sicuro che lo sia $_GET['token'] == $_SESSION['token']e no $_GET['token'] !== $_SESSION['token']?
Timo Huovinen

17

Utilizzo di $ _SERVER ["HTTP_REFERER"]

L'indirizzo della pagina (se presente) che ha indirizzato l'agente utente alla pagina corrente. Questo è impostato dall'agente utente. Non tutti i programmi utente lo imposteranno e alcuni forniscono la possibilità di modificare HTTP_REFERER come caratteristica. In breve, non ci si può davvero fidare.

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

0

Non esiste un modo affidabile per verificarlo. È davvero sotto la mano del cliente per dirti da dove viene. Potresti immaginare di utilizzare cookie o informazioni di sessioni inserite solo su alcune pagine del tuo sito web, ma così facendo interromperesti l'esperienza dell'utente con i segnalibri.


0

Abbiamo una sola opzione rimasta dopo aver letto tutti i falsi problemi del referrer: cioè la pagina che desideriamo monitorare come referrer dovrebbe essere tenuta in sessione e, come chiamato ajax, fare il check-in della sessione se ha il valore della pagina referrer e fare l'azione altrimenti no azione.

Mentre d'altra parte, mentre richiede qualsiasi pagina diversa, imposta il valore della sessione del referrer su null.

Ricorda che la variabile di sessione è impostata solo sulla richiesta della pagina del desiderio.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.