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 confiable 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 suponer que puede verse comprometida; debe diseñar dicha URL de modo 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, más bien son URL "oscuras".
Hay ciertos casos en los que es aceptable usar una URL "privada", pero son intrínsecamente menos seguros que los métodos de autenticación tradicionales, como la autenticación con contraseña o la autenticación basada en claves.
Algunos de los lugares que he visto comúnmente utilizar URL "privadas" son:
- Correo electrónico de restablecimiento de contraseña
- Correos electrónicos de generación de certificados
- Correo electrónico de confirmación de cuenta / correo electrónico
- Entrega de contenido comprado (libros electrónicos, etc.)
- Otras cosas misceláneas como el check-in 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 generalmente solo son buenas para operaciones de una sola vez. Además, la autenticación tradicional y las URL aleatorias no son mutuamente excluyentes ; de hecho, se pueden usar conjuntamente para proporcionar seguridad adicional al entregar un recurso.
Como Robert Harvey ha señalado, la única manera de usar de forma segura una URL aleatoria / privada es generar la página dinámicamente y enviar la URL al usuario de tal manera 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 tiempo razonable
- Debe ser una URL de un solo uso: es decir, debe caducar después de la primera vez que se accede.
- Debe diferir la autenticación del usuario a alguna otra entidad en la que confíe para autenticar de forma segura al usuario. (Al enviar el enlace por correo electrónico o SMS, etc.)
- Debería ser imposible para una computadora moderna forzar la URL en el período de tiempo que precede 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.
- No debe filtrar información sobre el usuario. IE: si la página va a restablecer una contraseña: la página no debe mostrar la información de la cuenta de los solicitantes. Si Alice solicita un enlace para restablecer la contraseña y Bob adivina de alguna manera la URL, Bob no debería tener forma de saber de quién es la contraseña que está restableciendo.
- Si se filtra información sobre el usuario, se debe usar además de 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.
Diferentes recursos requieren diferentes niveles de seguridad. Si desea 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.