2012-03-30 24 views
5

ho trovato molti modi per reindirizzamento alla pagina precedente dopo il login e l'esempio:Best practice per garantire il ritorno alla pagina precedente dopo la registrazione link url

  1. $_GET - necessità di convalidare
  2. $_SESSION - si sovrappone valore se si utilizzano più schede
  3. $_SERVER['HTTP_REFERER'] - è inviato dal browser al server

Sul modulo possiamo usare

<form action="/process/?return=/previous/page/?id=123" method="post" /> 

o utilizzare l'input nascosto.

<input type="hidden" name="return" value="$_GET or $_SESSION or $_SERVER" /> 

Posso sapere quali sono le migliori pratiche per garantire il valore restituito?

+0

Tutti questi metodi possono essere falsificati. Hai qualche ragione per cui hai bisogno che questo sia "sicuro"? – alexn

+0

Non è possibile utilizzare

Una richiesta deve essere GET o POST , non entrambi. Questo potrebbe funzionare su una connessione diretta, ma potrebbe rompersi quando si inserisce un proxy. – Tei

+0

penso che tu voglia proteggerti da "spoofing di forma"? in tal caso leggere http: //www.nyphp.org/PHundamentals/6_Spoofed-Form-Submissions –

risposta

5

La pratica più comune (anche su siti di e-commerce a pagamento checkout) è di avere un input nascosto con l'URL per reindirizzare a:

<input type="hidden" name="return" value="<?php echo($_SERVER['REQUEST_URI']); ?>" /> 

Sembra essere abbastanza sicuro per la maggior parte delle persone .. .

1

Beh, ci sono tre soluzioni che mi vengono in mente:

La soluzione migliore sarebbe quella di creare una whitelist contenente tutti i possibili gli URL, ma che è unmanagable nella maggior parte dei casi. Se hai la possibilità puoi auto-creare gli URL (forse dal database?). Neverthless:

<?php 
    $whitelist = array('url1', 'url2',...); 

    $referer = $_POST['referer']; 

    if(in_array($referer, $whitelist)) 
    { 
    header('Location: '.$referer); // redirect to target 
    } 
    else 
    { 
    header('Location: /'); // redirect to default page 
    } 
?> 

La seconda soluzione che mi viene in mente sarebbe quello di controllare l'url mediante espressioni regolari (dipende dal punto in cui l'utente può venire da).

La terza soluzione sembra utilizzare una chiave segreta per generare un token, che impedisce all'utente di forma-manomissione:

<?php 
    $referer = htmlspecialchars($_SERVER['REQUEST_URI'], ENT_QUOTES); // request-url or get value whatever you like 
    $secret = 'sfhuwefwejori234'; // key of your choice 
    $token = sha1($secret.$referer); 
?> 

<form action=....> 
    <input type="hidden" name="referer" value="<?php echo $referer; ?>" /> 
    <input type="hidden" name="refToken" value="<?php echo $token; ?>" /> 
... 

Nella pagina di destinazione, prima di reindirizzare l'utente, ricreare il token con il passato il valore e verificare se è corretto:

<?php 
    $referer = $_POST['referer']; 
    $token = $_POST['refToken']; 
    $secret = 'sfhuwefwejori234'; // SAME key as above, do never include this into a form, user cannot know this key 

    $originalToken = sha1($secret.$referer); 

    if($originalToken == $token) 
    { 
    header('Location: '.$referer); // redirect user 
    } 
    else 
    { 
    header('Location: /'); // Redirect to default page 
    } 
?> 

Questo vi proteggerà dalla forma manomissioni e cross-site-scripting.

Cheers!

-1

Non capisco di quale sicurezza si stia parlando.

Per le più moderne applicazioni Web non è necessario tornare da nessuna parte poiché si mantiene sempre lo stesso URL durante l'intero processo.

Problemi correlati