URL https com parâmetro de token: quão seguro é?


91

No nosso site, disponibilizamos aos utilizadores uma simulação baseada nas suas informações privadas (fornecidas através de um formulário). Gostaríamos de permitir que eles recuperassem os resultados da simulação mais tarde, mas sem forçá-los a criar uma conta de login / senha.

Pensamos em enviar a eles um e-mail com um link, a partir do qual eles poderão obter seus resultados. Mas, naturalmente, temos que proteger essa URL, porque dados privados estão em jogo.

Portanto, pretendemos passar um token (como uma combinação de letras e dígitos de 40 caracteres, ou um Hash MD5) na URL e usar SSL.

Finalmente, eles receberiam um e-mail como este:

Olá,
volte seus resultados em https://www.example.com/load_simulation?token=uZVTLBCWcw33RIhvnbxTKxTxM2rKJ7YJrwyUXhXn

O que você acha disso? É seguro o suficiente? O que você me aconselharia para a geração de tokens? Que tal passar parâmetros de URL em uma solicitação https?


Respostas:


101

SSL protegerá os parâmetros de consulta em trânsito; entretanto, o e-mail em si não é seguro, e o e-mail pode pular em qualquer número de servidores antes de chegar ao seu destino.

Além disso, dependendo do seu servidor web, o URL completo pode ser registrado em seus arquivos de log. Dependendo de quão sensíveis são os dados, você pode não querer que seu pessoal de TI tenha acesso a todos os tokens.

Além disso, o URL com a string de consulta seria salvo no histórico do usuário, permitindo que outros usuários da mesma máquina acessassem o URL.

Por fim, e o que torna isso muito inseguro, é que a URL é enviada no cabeçalho Referer de todas as solicitações de qualquer recurso, mesmo de recursos de terceiros. Portanto, se você estiver usando o Google Analytics, por exemplo, enviará ao Google o token de URL e tudo para eles.

Na minha opinião, isso é uma má ideia.


1
Não tinha pensado no problema do referenciador de HTTP, mas o link do url redirecionaria para a página de resultados, não seria uma página adequada (sem google analytics ou outro script de terceiros).
Flackou

6
A maioria dos navegadores não remove o referenciador ao ir de HTTPS para HTTP?
Kevin Mark

2
Isso é semelhante ao link de ativação do usuário (ou redefinição de senha), certo? Como, então, esse caso deve ser tratado? Muitos sites enviam urls de redefinição para e-mail, POST não é uma opção, pois deve ser clicável. Obrigado.
pinkpanther de

3
Então qual é a solução?
RT

1
e se o token no url não for o mesmo que o token usado para solicitações de API e durar apenas uma hora, qual seria o problema então?
user1709076

14

Eu usaria um cookie para isso. O fluxo de trabalho deve ser assim:

  1. O usuário acessa seu site pela primeira vez.
  2. Site define um cookie
  3. O usuário insere dados. Os dados são armazenados no banco de dados usando alguma chave armazenada no cookie.
  4. Quando o usuário sai, você envia a ele um e-mail com um link https:
  5. Quando o usuário volta, o site descobre o cookie e pode apresentar ao usuário os dados antigos.

Agora, o usuário deseja usar um navegador diferente em uma máquina diferente. Nesse caso, ofereça um botão de "transferência". Quando a usuária clicar neste botão, ela receberá um "token". Ela pode usar esse token em outro computador para redefinir o cookie. Dessa forma, o usuário decide o quão seguro deseja transferir o token.


4

SSL protege o conteúdo dos dados em trânsito, mas não tenho certeza sobre o URL.

Independentemente disso, uma maneira de atenuar a reutilização desse token de URL por um invasor é garantir que cada token só seja usado uma vez. Você pode até definir um cookie para que o usuário legítimo possa continuar a usar o link, mas após o primeiro acesso ele só funcionará para alguém com o cookie.

Se o e-mail do usuário for comprometido e um invasor obtiver o link primeiro, você está bloqueado. Mas o usuário também tem problemas maiores.


11
A conexão SSL é protegida antes de o URL ser transmitido.
David

1

O e-mail é inerentemente inseguro. Se alguém pode clicar nesse link e acessar os dados, você não os está protegendo.


Exato, mas muitos sites não se importam com isso e enviam login / senhas por e-mail. Mas não é motivo para imitá-los ...
Flackou

Não concordo em nenhuma razão para imitá-los, mas geralmente dizem para você alterar a senha depois de fazer o login pela primeira vez.
Jason Punyon

1

Bem, o token é seguro ao passar por SSL. O problema que você vai ter é que ele está disponível para as pessoas (aquelas a quem não se destina) por ser capaz de visualizar a URL.

Se for uma informação privada, como SSN, não acho que enviaria uma URL por e-mail. Prefiro que eles criem um nome de usuário e uma senha para o site. É muito fácil comprometer um e-mail com esse tipo de informação em jogo para você e para eles. Se a conta de alguém for comprometida, será questionado de quem é realmente a culpa. Quanto mais seguro, melhor você é do ponto de vista estritamente CYA.


1
Você está certo: o URL permaneceria no histórico do navegador, por exemplo
Flackou

0

Eu realmente não consideraria isso seguro o suficiente para uma situação em que há sérios problemas de privacidade. O fato de você estar enviando a URL em um e-mail (provavelmente em texto não criptografado) é de longe o link mais fraco. Depois disso, há o risco de ataques de força bruta aos tokens, que (sem a estrutura de um mecanismo de autenticação real) provavelmente são mais vulneráveis ​​do que uma configuração de nome de usuário e senha bem construída.

Aliás, não há problemas com os parâmetros de uma solicitação https.


Você está certo sobre o risco de ataques de força bruta. Não vejo como poderíamos impedir os bots desse tipo de ataque. Proibir "insistir" nos IPs não seria uma proteção suficiente. Você teria ideias sobre o assunto?
Flackou

Na verdade, com o tipo de espaço de chave que estamos falando, colocando um if (this_ip_number_has_requested_an_invalid_token_today ()) sleep (5); em seu script load_simulation seria uma proteção perfeitamente suficiente. (A limitação de taxa é um dos recursos de bons mecanismos de autenticação.)
caos

Obrigado pela sua resposta. Mas eu pensei que um mesmo bot poderia facilmente pegar IPs diferentes, o que tornava o limite de taxa de IP insuficiente. Estou errado?
Flackou

Tudo o que os pega é uma tentativa não atrasada por IP. O espaço de endereço IP não está tão facilmente disponível para ser útil.
caos

0

Do jeito que está, seria uma má ideia. Você vai assustar a segurança com fácil uso. Como dito antes, o SSL protegerá apenas a transferência de informações entre o servidor e o navegador do cliente e impedirá apenas o ataque de intermediário. Os emails são muito arriscados e inseguros.

O melhor seria uma autenticação de nome de usuário e senha para acessar as informações.

Eu gosto mais ou menos da ideia do biscoito. Você também deve criptografar as informações do cookie. Você também deve gerar o token com salt e frase-chave mais o $ _SERVER ['HTTP_USER_AGENT'] para limitar a probabilidade de um ataque. Armazene o máximo de informações não sensíveis sobre o cliente no cookie para uso de verificação.

A frase-chave pode ser armazenada no cookie para facilitar o uso, mas tenha em mente que o cookie também pode ser roubado = (.

Melhor deixar o cliente digitar a frase-chave que ele forneceu, que também é armazenada no banco de dados junto com seus dados.

Ou, a chave pode ser usada no caso da pessoa usar uma máquina diferente que difere nos parâmetros $ _SERVER ['HTTP_USER_AGENT'] ou simplesmente perder o cookie. Portanto, o cookie pode ser transferido ou definido.

Certifique-se também de que os dados confidenciais sejam criptografados no banco de dados. Nunca se sabe ;)


-1

Você está ciente de que se qualquer hacker tiver acesso ao seu banco de dados, muitas informações pessoais podem ser fornecidas gratuitamente?

Depois disso, eu diria que não é má ideia. Eu não usaria MD5 ou SHA1 porque eles não são muito seguros para hash. Eles podem ser "descriptografados" (eu sei que não é criptografia) com bastante facilidade.

Caso contrário, talvez eu usaria uma segunda informação que não seria enviada por e-mail, tipo de senha. O motivo é bastante simples, se alguém obtiver acesso ao e-mail do usuário (bastante fácil com o hotmail se você não finalizar sua sessão), ele terá acesso a todas as informações que o usuário enviou.

Observe que o HTTPS protegerá e criptografará os dados enviados do seu site para o usuário final. Nada mais, tome-o como um túnel seguro. Nada mais nada menos.


Como exatamente um hash SHA1 salgado é descriptografado em qualquer sentido da palavra?
Eli

"Você está ciente de que, se qualquer hacker obtiver acesso ao seu banco de dados, muitas informações pessoais podem ser fornecidas gratuitamente?" Sim, mas não é um problema para todos os sites ??
Flackou

@Flackou sim, mas se você obtiver acesso ao banco de dados do paypal, não encontrará informações claramente salvas do cartão de crédito, tudo é criptografado. @Eli: theregister.co.uk/2005/02/17/sha1_hashing_broken
Erick

-1

Pelo que entendi da sua ideia, em teoria, alguém poderia digitar uma string aleatória de 40 caracteres ou hash MD5 e obter os detalhes de outra pessoa. Embora isso possa ser altamente improvável, só precisa acontecer uma vez.

Uma solução melhor pode ser enviar ao usuário um token e, em seguida, pedir-lhe que insira alguns dos detalhes, como nome, código postal, ssn ou uma combinação deles.


5
SSN? Você está falando sério? De qualquer forma, sugiro que você faça as contas de quantas strings aleatórias de 40 caracteres existem. É mais do que apenas "altamente improvável"
Eli

Você está certo, provavelmente deveríamos adicionar outro parâmetro na url, como o e-mail (mesmo se a..z + A..Z + 0..9 = 62 caracteres e 62 ^ 40 seja um número bem grande).
Flackou

Caras, 62 ^ 40 é consideravelmente mais do que o número de átomos no universo. É literalmente indescritível.
Eli

1
Estou surpreso com a quantidade de pessoas que não conseguem entender a escala desses números. Se você estivesse adivinhando MILHÕES de tokens por segundo, é muito mais provável que o sol queime antes de você acertar
Eli

4
Richard, parece que você está apontando o que normalmente é chamado de Paradoxo do Aniversário ... não é apenas o número de combinações possíveis que importa, mas quantas delas são usadas. Bem, neste caso, você precisa usar cerca de 2 ^ 119 das 62 ^ 40 combinações antes que a chance se torne significativa.
erickson
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.