Bueno, hay tres soluciones que vienen a la mente:
La mejor solución sería la creación de una lista blanca que contiene todas las direcciones URL posibles, pero eso es unmanagable en la mayoría de los casos. Si tiene la posibilidad, puede crear automáticamente las URL (¿tal vez desde la base de datos?). 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 segunda solución que viene a la mente sería comprobar la URL usando expresiones regulares (depende de donde el usuario puede provenir de).
La tercera solución parece usar una clave secreta para generar una ficha, que evita que el usuario forma la manipulación:
<?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; ?>" />
...
En la página de destino, antes de redirigir el usuario, recrear el contador con el pasado valor y comprobar si es correcto:
<?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
}
?>
Esto lo protegerá frente a manipulaciones forma y cross-site-scripting.
¡Salud!
Todos esos métodos pueden ser falsificados. ¿Tienes alguna razón para por qué necesitas que esto sea 'seguro'? – alexn
No se puede utilizar
petición deberá GET o POST , no ambos. Esto puede funcionar en una conexión directa, pero puede romperse cuando coloque un proxy. – Teicreo que quieres protegerte de "spoofing de formas"? si es así, lee http: //www.nyphp.org/PHundamentals/6_Spoofed-Form-Submissions –