¿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
Respuesta
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.
Si desea utilizar este método, también debe consultar la referencia para evitar CSRF http://en.wikipedia.org/wiki/Cast-site_request_forgery –
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
@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. –
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.
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.
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;
No veo cómo esto es relevante en absoluto; de hecho, ignora la pregunta tan completamente que se lee como spam. – felwithe
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.
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
¿Estás seguro de que es '$ _GET ['token'] == $ _SESSION ['token'] 'y no' $ _GET ['token']! == $ _SESSION ['token'] '? –
- 1. ¿Cómo se obtiene el encabezado 'referer' en PHP?
- 2. Redirigiendo al referer
- 3. Alternativa al encabezado "Referer"
- 4. Cómo falsificar http referer
- 5. Url fragment y Referer header
- 6. Internet Explorer http referer problema
- 7. Especificación del referer HTTP en UIWebView incrustado
- 8. Cambiar el referer http en javascript
- 9. Establecer el encabezado del Referer en asp.net
- 10. Cómo guardar http referer en rieles
- 11. determinar si existe $ _SESSION superglobal en PHP
- 12. PHP: ¿cómo determinar si el navegador admite javascript en PHP?
- 13. Bloque por useragent o referer vacío
- 14. Determinar el espejo más cercano PHP
- 15. Flash en Firefox no envía el valor HTTP REFERER
- 16. ¿Debo verificar HTTP Referer en OAuth 2 Callback?
- 17. JavaScript window.location no establece referer en el encabezado de solicitud
- 18. Cómo determinar si el valor es una fecha en PHP
- 19. ¿Cómo determinar programáticamente la raíz del documento en PHP?
- 20. ¿Cómo puedo determinar si una matriz está vacía en PHP?
- 21. Determinar el número de dimensiones en una matriz PHP
- 22. ¿Cómo puedo determinar si una URL redirecciona en PHP?
- 23. Determinar en script php si está conectado a internet?
- 24. impidiendo que CSRF en php
- 25. ¿Cómo cambia Google Instant el referer enviado por el navegador?
- 26. ¿Una redirección 302 mantendrá la cadena del referer?
- 27. Redirigir sobre la base del referer HTTP_REFERER htaccess
- 28. establecer la URL del referer con la solicitud ajax
- 29. ASPNET MVC: ¿Cómo encontrar la ruta del referer (sic)?
- 30. Determinar las consecuencias de rendimiento del código PHP
¿Por qué dices $ _SERVER ['HTTP_REFERER'] no es confiable? –
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
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