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!
fonte
2012-03-30 09:33:41
Tutti questi metodi possono essere falsificati. Hai qualche ragione per cui hai bisogno che questo sia "sicuro"? – alexn
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. – Teipenso che tu voglia proteggerti da "spoofing di forma"? in tal caso leggere http: //www.nyphp.org/PHundamentals/6_Spoofed-Form-Submissions –