Posso implementar um sistema de autenticação de usuário web em python sem POST?

StackOverflow https://stackoverflow.com/questions/69979

  •  09-06-2019
  •  | 
  •  

Pergunta

Minha universidade não suporta o método POST cgi (eu sei, é uma loucura), e eu esperava poder ter um sistema onde um usuário pudesse ter um nome de usuário e senha e fazer login com segurança.Isso é possível?

Se não for, como você faria isso com o POST?Apenas por curiosidade.

Saúde!

Foi útil?

Solução

Na verdade, você pode fazer tudo isso com métodos GET.No entanto, você desejará usar um protocolo completo de resposta a desafios para os logins.(Você pode fazer hash no lado do cliente usando javascript.Você só precisa enviar um desafio único a cada vez. Você também desejará usar SSL para garantir que ninguém possa ver as strings à medida que elas passam.

Em alguns sentidos, não há diferença real de segurança entre as solicitações GET e POST, pois ambas são transmitidas em texto simples, em outros sentidos e na prática...GET é muito mais fácil de interceptar e está presente nos registros da maioria das pessoas e no histórico do seu navegador.:)

(Ou, como sugerido pelos outros postadores, use um método totalmente diferente, como autenticação HTTP, autenticação digest ou algum esquema de autenticação de nível superior, como AD, LDAP, Kerberos ou shib.No entanto, eu meio que presumi que se você não tivesse o POST, você também não os teria.)

Outras dicas

Você poderia usar a autenticação HTTP, se suportada.

Você teria que adicionar SSL, pois todos os métodos POST, GET e HTTP Auth (bem, exceto a autenticação Digest HHTP) enviam texto simples.

GET é basicamente como o POST, apenas tem um limite na quantidade de dados que você pode enviar, que geralmente é muito menor que o POST e uma diferença semântica que faz com que o GET não seja um bom candidato desse ponto de vista, mesmo que tecnicamente ambos pode fazer isso.

Como exemplos, o que você está usando?Existem muitas opções em Python, como o módulo cgi ou algum framework como Django, CherryPy e assim por diante

Com um pouco de JavaScript, você pode fazer com que o cliente faça o hash da senha inserida e de um nonce gerado pelo servidor, e use isso em um HTTP GET.

Uma boa escolha: Autenticação HTTP Digest

Mais difícil de fazer bem, mas é uma opção: Hashing do lado do cliente com Javascript

Javascript é a melhor opção neste caso.

Junto com a solicitação de nome de usuário e senha, ele envia uma string aleatória exclusiva.Você pode então usar uma biblioteca javascript md5 para gerar uma senha com hash, combinando a string aleatória e a senha [pwhash = md5(randomstring+password)].O javascript então instancia a chamada para http://SERVER/login.cgi?username=TheUsername&random=RANDOMSTRING&pwhash=0123456789abcdef0123456789abcdef

O servidor deve então fazer duas coisas:Verifique se a string aleatória JÁ foi usada antes e, se tiver, negue a solicitação.(muito importante para segurança)

Procure a senha em texto simples para nome de usuário e faça md5 (randomstring + senha).Se isso corresponder ao que o usuário forneceu na URL como pwhash, então você sabe que é o usuário.

A razão pela qual você verifica se a string aleatória já foi usada antes é para interromper um ataque repetido.Se alguém conseguir ver o tráfego de rede ou o histórico ou logs do navegador, poderá simplesmente fazer login novamente usando o mesmo URL, e não importa se sabe a senha original ou não.

Também recomendo colocar "Pragma:sem cache" e "Controle de cache:no-cache" na parte superior dos cabeçalhos retornados pelo script CGI, apenas para que a sessão autenticada não seja armazenada no cache da web do navegador ou do seu ISP.

Uma solução ainda mais segura seria usar criptografia adequada e resposta a desafios.Você informa ao servidor seu nome de usuário, o servidor envia de volta um Desafio (alguma sequência aleatória criptografada com sua senha) e você informa ao servidor qual era a sequência aleatória.Se você puder informar o servidor, obviamente você tem a senha e é quem diz ser!Kerberos faz isso dessa maneira, mas com muito mais cuidado para evitar todos os tipos de ataques.

Fazer login com segurança é muito subjetivo.A 'segurança' total não é fácil de alcançar (se possível... discutível).No entanto, você pode chegar perto.

Se POST não for uma opção, talvez você possa usar um método de segurança de diretório, como .htaccess ou autenticação do Windows, dependendo do sistema em que você está.

Ambas as opções acima exibirão uma janela pop-up que permite inserir um nome de usuário e uma senha.

Para usar POST como método para enviar as credenciais de login, basta usar um formulário HTML com method="post" e recuperar as informações de, digamos, uma página PHP ou ASP, usando o método $_POST['varname'] em PHP ou o método request.form("varname") em ASP.Na página PHP ou ASP, por exemplo, você pode fazer uma pesquisa em um banco de dados de usuários, para ver se aquela combinação de nome de usuário/senha existe e, em caso afirmativo, redirecioná-los para a página apropriada.

Como referência, use http://www.w3schools.com/ASP/showasp.asp?filename=demo_simpleform para a parte HTML/ASP

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top