2008-10-03 14 views
94

¿Cuál es la forma más confiable y segura de determinar qué página ya sea enviada o llamada (a través de AJAX), la página actual. No deseo utilizar el $_SERVER['HTTP_REFERER'], debido a la (falta de) confiabilidad, y necesito que la página a la que se llama solo provenga de solicitudes que se originen en mi sitio.

Editar: Estoy buscando para verificar que una secuencia de comandos que preforma una serie de acciones se llama desde una página en mi sitio web.Determinar Referer en PHP

+5

¿Por qué dices $ _SERVER ['HTTP_REFERER'] no es confiable? –

+8

La implementación de PHP es confiable. El problema es que no siempre el navegador está enviando esto, e incluso puede modificarlo si lo desea. Por lo tanto, no es confiable que sea correcto desde el lado del cliente. – Biri

+2

Una posible forma es poner una clave única (por ejemplo, un GUID) en un campo de su página y enviarla de vuelta en la siguiente solicitud. – PhiLho

Respuesta

87

El REFERER es enviado por el navegador del cliente como parte del protocolo HTTP, y por lo tanto no es confiable. Puede que no esté allí, podría estar falsificado, simplemente no puedes confiar si es por razones de seguridad.

Si desea verificar si una solicitud procede de su sitio, no puede, pero puede verificar que el usuario ha estado en su sitio y/o está autenticado. Las cookies se envían en solicitudes AJAX para que pueda confiar en eso.

+5

Si desea utilizar este método, también debe consultar la referencia para evitar CSRF http://en.wikipedia.org/wiki/Cast-site_request_forgery –

+16

Idealmente, debe usar un token único por sesión por usuario (por solicitud si eres paranoico) para prevenir ataques CSRF. Comprobar el referente es solo seguridad por ofuscación y no es una solución real. – Seldaek

+2

@Seldaek no, verificar que el referidor no sea 'seguridad por ofuscación'. Un atacante que intenta realizar un ataque CSRF no puede controlar el referidor enviado por el navegador de la víctima, por lo que si lo hace, lo protege * contra el CSRF. Sin embargo, estoy de acuerdo con su conclusión de que debe usar un token CSRF en su lugar, ya que el enfoque de comprobación del referer tiene [desventajas] (https://www.owasp.org/index.php/Cross-Site_Request_Forgery_ (CSRF) _Prevention_Cheat_Sheet #Checking_The_Referer_Header), lo que lo deja vulnerable si tiene un redireccionamiento abierto en su sitio y está buscando agentes de usuario que despojen al referer. –

0

No hay manera confiable de verificar esto. Está realmente bajo la mano del cliente decirte de dónde vino. Se puede imaginar el uso de cookies o información de sesiones que se publican solo en algunas páginas de su sitio web, pero al hacerlo, se rompería la experiencia del usuario con los marcadores.

0

Hemos opción sólo único que queda después de leer todos los problemas referenciales falsos: es decir La página que deseamos incluir en el seguimiento de referencia debe ser guardado en la sesión, y como Ajax llamada a continuación, comprobar en sesión si tiene valor página de referencia y haciendo la acción de otra manera no hay acción.

Mientras que, por otro lado, como solicita cualquier página diferente, entonces el valor de la sesión de referencia es nulo.

Recuerde que la variable de sesión se configura solo en la solicitud de deseo de página.

12

Usando $_SERVER [ 'HTTP_REFERER']

La dirección de la página (si existe) que se refiere al agente de usuario a la página actual . Esto es establecido por el agente de usuario. No todos los agentes de usuario marcarán , y algunos proporcionan la capacidad de modificar HTTP_REFERER como una característica . En resumen, realmente no se puede confiar.

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

No veo cómo esto es relevante en absoluto; de hecho, ignora la pregunta tan completamente que se lee como spam. – felwithe

21

Lo que he encontrado mejor es un CSRF token y guardarlo en la sesión de enlaces donde se necesita para verificar la URL de referencia.

Así que si usted está generando una devolución de llamada FB entonces sería algo como esto:

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

Entonces el index.php se verá así:

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

//Continue with the rest of code 

Sé de sitios seguros que hacen el equivalente de esto para todas sus páginas seguras.

+1

Aquí hay un enlace para obtener más información sobre los tokens de CSRF: http://en.wikipedia.org/wiki/Cast-site_request_forgery – We0

+7

¿Estás seguro de que es '$ _GET ['token'] == $ _SESSION ['token'] 'y no' $ _GET ['token']! == $ _SESSION ['token'] '? –

Cuestiones relacionadas