2012-03-30 11 views
5

he encontrado muchas maneras de redirección a la página anterior después de inicio de sesión y el ejemplo:mejores prácticas para asegurar el retorno a la página anterior después de anunciarse o enlace URL

  1. $_GET - necesidad de validar
  2. $_SESSION - anulará el valor si el uso de múltiples pestañas
  3. $_SERVER['HTTP_REFERER'] - es enviado por el navegador al servidor

en forma podemos utilizar

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

o usando la entrada oculta.

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

¿Puedo saber cuáles son las mejores prácticas para garantizar el valor de retorno?

+0

Todos esos métodos pueden ser falsificados. ¿Tienes alguna razón para por qué necesitas que esto sea 'seguro'? – alexn

+0

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. – Tei

+0

creo que quieres protegerte de "spoofing de formas"? si es así, lee http: //www.nyphp.org/PHundamentals/6_Spoofed-Form-Submissions –

Respuesta

5

La práctica más común (también en sitios de comercio electrónico en la caja de pago) es tener un campo oculto con el URL para redirigir a:

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

Parece ser lo suficientemente seguro para la mayoría de la gente .. .

1

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!

-1

No entiendo de qué seguridad está hablando.

Para las aplicaciones web más modernas no tiene que regresar a ninguna parte, ya que solo mantiene la misma URL durante todo el proceso.

Cuestiones relacionadas