Nota:
Muitas pessoas parecem estar confundindo um URL "privado" com autenticação. Além disso, parece haver alguma confusão de que o envio do link por uma entidade confiável é uma tentativa de autenticação de dois fatores. Para deixar claro, estamos falando de um recurso acessível ao público, embora seja suficientemente difícil de adivinhar.
Ao usar um URL privado, você deve sempre assumir que ele pode ser comprometido - você deve criar um URL para que, mesmo que seja comprometido, o recurso não vaze informações para o invasor.
URLs privados / difíceis de adivinhar não são equivalentes à autenticação baseada em senha. Por natureza, os URLs privados não são privados - são recursos acessíveis ao público. Eu acho que o termo URL "privado" é um nome impróprio, mas são URLs "obscuros".
Há certos casos em que o uso de um URL "privado" é aceitável, mas eles são inerentemente menos seguros que os métodos de autenticação tradicionais, como autenticação por senha ou autenticação baseada em chave.
Alguns dos lugares que eu normalmente vi URLs "particulares" usados são:
- Redefinir senha por e-mail
- E-mails de geração de certificado
- E-mails de confirmação da conta / e-mail
- Entrega do conteúdo comprado (e-books, etc.)
- Outras coisas diversas, como check-in de voo, cartão de embarque impresso, usam URLs particulares, além da autenticação tradicional
O ponto comum aqui é que URLs aleatórios normalmente são bons apenas para operações de uma só vez. Além disso, a autenticação tradicional e URLs aleatórios não são mutuamente exclusivos - na verdade, eles podem ser usados em conjunto para fornecer segurança adicional ao fornecer um recurso.
Como Robert Harvey apontou, a única maneira de usar com segurança um URL aleatório / privado é gerar a página dinamicamente e enviá-lo ao usuário de uma maneira que o usuário possa ser considerado semi-autenticado. Pode ser email, SMS etc.
Um URL privado / gerado aleatoriamente geralmente possui algumas propriedades:
- Deve expirar após um período de tempo razoável
- Deve ser um URL de uso único: ou seja, deve expirar após a primeira vez que for acessado.
- Deve adiar a autenticação do usuário para outra entidade em que confia para autenticar com segurança o usuário. (Enviando o link por e-mail ou SMS, etc)
- Deveria ser impossível para um computador moderno forçar com força o URL no período anterior à expiração - limitando a taxa da API que expõe o recurso ou criando um ponto de extremidade de URL com entropia suficiente para que não possa ser adivinhado.
- Não deve vazar informações sobre o usuário. IE: Se a página for redefinir uma senha: a página não deve exibir as informações da conta do solicitante. Se Alice solicitar um link de redefinição de senha e Bob de alguma forma adivinhar o URL, Bob não deverá ter como saber de quem está redefinindo a senha.
- Se vazar informações sobre o usuário, ele deverá ser usado em cima da autenticação tradicional; por exemplo, uma página pode considerar um usuário autenticado se ele tiver um conjunto de cookies ou se o ID da sessão ainda for válido.
Recursos diferentes requerem diferentes níveis de segurança. Se você deseja compartilhar uma receita secreta com alguns amigos, por exemplo, seria aceitável usar um URL aleatório / privado para compartilhá-lo com eles. No entanto, se o recurso puder ser usado para roubar a identidade de alguém ou comprometer suas contas com outros provedores de serviços, você provavelmente se importaria muito mais com a restrição de acesso a esse recurso.