¿Puedo implementar un sistema de autenticación de usuarios web en Python sin POST?

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

  •  09-06-2019
  •  | 
  •  

Pregunta

Mi universidad no admite el método POST cgi (lo sé, es una locura) y esperaba poder tener un sistema donde un usuario pueda tener un nombre de usuario y contraseña e iniciar sesión de forma segura.¿Es esto siquiera posible?

Si no es así, ¿cómo lo harías con POST?Solo por curiosidad.

¡Salud!

¿Fue útil?

Solución

De hecho, puedes hacerlo todo con métodos GET.Sin embargo, querrás utilizar un protocolo de respuesta de desafío completo para los inicios de sesión.(Puede realizar hash en el lado del cliente usando javascript.Solo necesita enviar un desafío único cada vez). También querrá usar SSL para asegurarse de que nadie pueda ver las cadenas a medida que avanzan.

En algunos sentidos, no existe una diferencia de seguridad real entre las solicitudes GET y POST, ya que ambas se transmiten en texto sin formato, en otros sentidos y en la práctica...GET es muchísimo más fácil de interceptar y está en todos los registros de la mayoría de las personas y en el historial de su navegador web.:)

(O como lo sugieren los otros carteles, use un método completamente diferente como autenticación HTTP, autenticación implícita o algún esquema de autenticación de nivel superior como AD, LDAP, kerberos o shib.Sin embargo, asumí que si no tuvieras POST tampoco los tendrías).

Otros consejos

Puede utilizar la autenticación HTTP, si es compatible.

Tendría que agregar SSL, ya que todos los métodos, POST, GET y HTTP Auth (bueno, excepto la autenticación Digest HHTP) envían texto sin formato.

GET es básicamente como POST, sólo que tiene un límite en la cantidad de datos que puedes enviar, que suele ser mucho menor que POST y una diferencia semántica que hace que GET no sea un buen candidato desde ese punto de vista, incluso si técnicamente ambos son lo puede hacer.

En cuanto a ejemplos, ¿qué estás usando?Hay muchas opciones en Python, como el módulo cgi o algún marco como Django, CherryPy, etc.

Con un poco de JavaScript, puede hacer que el cliente haga un hash de la contraseña ingresada y un nonce generado por el servidor, y usarlo en un GET HTTP.

Una buena eleccion: Autenticación implícita HTTP

Es más difícil lograrlo bien, pero existe una opción: Hash del lado del cliente con Javascript

Javascript es la mejor opción en este caso.

Junto con la solicitud del nombre de usuario y la contraseña, envía una cadena aleatoria única.Luego puede usar una biblioteca javascript md5 para generar una contraseña hash, combinando la cadena aleatoria y la contraseña [pwhash = md5(randomstring+password)].Luego, javascript crea una instancia de la llamada a http://SERVIDOR/login.cgi?username=TheUsername&random=RANDOMSTRING&pwhash=0123456789abcdef0123456789abcdef

Entonces el servidor debe hacer dos cosas:Compruebe si la cadena aleatoria alguna vez se ha utilizado antes y, de ser así, rechace la solicitud.(muy importante por seguridad)

Busque la contraseña en texto plano para el nombre de usuario y ejecute md5 (cadena aleatoria + contraseña).Si eso coincide con lo que el usuario proporcionó en la URL como pwhash, entonces sabrá que es el usuario.

La razón por la que verifica si la cadena aleatoria se ha utilizado alguna vez antes es para detener un ataque repetido.Si alguien puede ver el tráfico de la red o el historial o los registros del navegador, simplemente puede iniciar sesión nuevamente usando la misma URL, y no importa si conoce la contraseña original o no.

También recomiendo poner "Pragma:no-cache" y "Cache-Control:no-cache" en la parte superior de los encabezados devueltos por el script CGI, solo para que la sesión autenticada no se almacene en la caché web del navegador o de su ISP.

Una solución aún más segura sería utilizar un cifrado adecuado y Desafío-Respuesta.Le dice al servidor su nombre de usuario, el servidor le devuelve un desafío (una cadena aleatoria cifrada con su contraseña) y le dice al servidor cuál era la cadena aleatoria.Si puedes decírselo al servidor, entonces obviamente tienes la contraseña y eres quien dices ser.Kerberos lo hace de esta manera, pero con mucho más cuidado para evitar todo tipo de ataques.

Iniciar sesión de forma segura es muy subjetivo.La "seguridad" total no es fácil de lograr (si es posible... discutible).Sin embargo, puedes acercarte.

Si POST no es una opción, tal vez pueda usar un método de seguridad de directorio como .htaccess o autenticación de Windows, según el sistema en el que se encuentre.

Con ambas opciones aparecerá una ventana emergente que permite ingresar un nombre de usuario y contraseña.

Para usar POST como método para enviar las credenciales de inicio de sesión, simplemente usaría un formulario HTML con método="post" y recuperaría la información de, por ejemplo, una página PHP o ASP, usando el método $_POST['varname'] en PHP o el método request.form("varname") en ASP.Desde la página PHP o ASP, por ejemplo, puedes hacer una búsqueda en una base de datos de usuarios, para ver si esa combinación de nombre de usuario/contraseña existe y, de ser así, redirigirlos a la página adecuada.

Como referencia, utilice http://www.w3schools.com/ASP/showasp.asp?filename=demo_simpleform para la parte HTML/ASP

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top