Nota:
Muitas pessoas parecem confundir um URL "privado" com autenticação. Além disso, parece haver alguma confusão de que enviar o link por meio de uma entidade confiável é uma tentativa de autenticação de dois fatores. Para ser claro, estamos falando de um recurso de acesso público, embora um que 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 ele seja comprometido, o recurso não vaze informações para o invasor.
URLs privados / difíceis de adivinhar não são equivalentes a 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 "privado" URL é um equívoco, mas eles são "obscuros" URLs.
Existem certos casos em que o uso de um URL "particular" é aceitável, mas eles são inerentemente menos seguros do que os métodos de autenticação tradicionais, como autenticação por senha ou autenticação baseada em chave.
Alguns dos lugares que eu geralmente vi URLs "particulares" usados são:
- E-mails de redefinição de senha
- Emails de geração de certificado
- Emails de confirmação da conta / email
- Entrega do conteúdo comprado (e-books, etc)
- Outras coisas diversas, como check-in de voo, impressão de cartão de embarque, uso de URLs particulares, além da autenticação tradicional
O ponto comum aqui é que URLs aleatórios são tipicamente bons apenas para operações de um tiro. Além disso, a autenticação tradicional e os URLs aleatórios não são mutuamente exclusivos - na verdade, eles podem ser usados em conjunto uns com os outros para fornecer segurança adicional ao entregar um recurso.
Como Robert Harvey apontou, a única maneira de usar com segurança uma URL aleatória / privada é gerar a página dinamicamente e enviar a URL ao usuário de forma que o usuário possa ser considerado semi-autenticado. Isso pode ser e-mail, SMS, etc.
Normalmente, um URL privado / gerado aleatoriamente tem algumas propriedades:
- Deve expirar após um tempo razoável
- Deve ser um URL de uso único: ou seja, ele deve expirar após a primeira vez em que é acessado.
- Deve adiar a autenticação do usuário para alguma outra entidade em que ele confie para autenticar com segurança o usuário. (Enviando o link via e-mail ou SMS, etc)
- Deve ser impossível para um computador moderno forçar a URL no período de tempo antes da expiração - seja pela taxa que limita a API que expõe o recurso ou pela criação de um endpoint de url com entropia suficiente de tal forma que não seja possível adivinhar. / li>
- 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 adivinhar o URL, Bob não deve saber qual senha ele está redefinindo.
- Se vazar informações sobre o usuário, ele deve ser usado em cima da autenticação tradicional, por exemplo, uma página pode considerar um usuário autenticado se tiver um conjunto de cookies ou se o seu session_id ainda for válido.
Recursos diferentes requerem diferentes níveis de segurança. Se você quiser compartilhar uma receita secreta com alguns amigos, por exemplo, seria aceitável usar um URL aleatório / privado para compartilhá-la 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 em restringir o acesso a esse recurso.