Nota:
Mucha gente parece estar confundiendo una URL "privada" con la autenticación. Además, parece haber cierta confusión de que enviar el enlace a través de una entidad de confianza es un intento de autenticación de dos factores. Para ser claros, estamos hablando de un recurso de acceso público, aunque sea lo suficientemente difícil de adivinar.
Al usar una URL privada, siempre debe asumir que puede estar comprometida, debe diseñar dicha URL para que, incluso si está comprometida, el recurso no filtre información al atacante.
Las URL privadas / difíciles de adivinar no son equivalentes a la autenticación basada en contraseña. Por naturaleza, las URL privadas no son privadas en absoluto, son recursos de acceso público. Creo que el término "URL privada" es un nombre inapropiado, en lugar de que sean URL "oscuras".
Hay ciertos casos en los que usar una URL "privada" es aceptable, pero son intrínsecamente menos seguros que los métodos de autenticación tradicionales, como la autenticación de contraseña o la autenticación basada en clave.
Algunos de los lugares que he visto comúnmente como URL "privados" son:
- Contraseña para restablecer correos electrónicos
- Correos electrónicos de generación de certificados
- Correos electrónicos de confirmación de cuenta / correo electrónico
- Entrega del contenido comprado (libros electrónicos, etc.)
- Otras cosas misceláneas como el registro de vuelo, imprimir la tarjeta de embarque, usar URL privadas además de la autenticación tradicional
Lo común aquí es que las URL aleatorias normalmente solo son buenas para operaciones de un solo disparo. Además, la autenticación tradicional y las URL aleatorias no se excluyen mutuamente , de hecho, se pueden usar conjuntamente para proporcionar seguridad adicional al entregar un recurso.
Como ha señalado Robert Harvey, la única forma de utilizar de forma segura una URL aleatoria / privada es generar la página de forma dinámica y enviar la URL al usuario de forma tal que el usuario pueda considerarse semi-autenticado. Esto podría ser correo electrónico, SMS, etc.
Una URL privada / generada aleatoriamente tiene algunas propiedades:
- Debería caducar después de un período de tiempo razonable
- Debería ser una URL de un solo uso: IE debería caducar después de la primera vez que se acceda.
- Debería diferir la autenticación del usuario a alguna otra entidad en la que confíe para autenticar al usuario de forma segura. (Enviando el enlace por correo electrónico o SMS, etc.)
- Para una computadora moderna debería ser imposible forzar la fuerza bruta de la URL en el período de tiempo anterior al vencimiento, ya sea limitando la velocidad de la API que expone el recurso o creando un punto final de URL con suficiente entropía para que no se pueda adivinar. / li>
- No debe filtrar información sobre el usuario. IE: Si la página es para restablecer una contraseña: la página no debe mostrar la información de la cuenta del solicitante. Si Alice solicita un enlace para restablecer la contraseña y Bob de alguna manera adivina la URL, Bob no debería tener forma de saber de quién se está restableciendo la contraseña.
- Si filtra información sobre el usuario, debe usarse sobre la autenticación tradicional, por ejemplo, una página puede considerar a un usuario autenticado si tiene un conjunto de cookies o si su session_id sigue siendo válido.
Los diferentes recursos requieren diferentes niveles de seguridad. Si quieres compartir una receta secreta con algunos amigos, por ejemplo, sería aceptable usar una URL aleatoria / privada para compartirla con ellos. Sin embargo, si el recurso pudiera usarse para robar la identidad de alguien o comprometer sus cuentas con otros proveedores de servicios, es probable que le importe mucho más restringir el acceso a ese recurso.