Puis-je implémenter un système d'authentification d'utilisateur Web en python sans POST?

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

  •  09-06-2019
  •  | 
  •  

Question

Mon université ne prend pas en charge la méthode POST cgi (je sais, c’est fou), et j’espérais pouvoir disposer d’un système permettant à un utilisateur de disposer d’un nom d’utilisateur et d’un mot de passe et de se connecter en toute sécurité. Est-ce même possible?

Si ce n’est pas le cas, comment le feriez-vous avec POST? Juste par curiosité.

Salut!

Était-ce utile?

La solution

Vous pouvez réellement tout faire avec les méthodes GET. Toutefois, vous souhaiterez utiliser un protocole de réponse à une demande de vérification complète pour les connexions. (Vous pouvez utiliser hachage du côté client à l'aide de javascript. Il vous suffit d'envoyer un défi unique à chaque fois.) Vous voudrez également utiliser SSL pour vous assurer que personne ne peut voir les chaînes lorsqu'elles passent.

À certains égards, il n’ya pas de réelle différence de sécurité entre les demandes GET et POST, car elles sont toutes les deux en texte clair, dans d’autres sens et dans la pratique ... Les méthodes GET sont beaucoup plus faciles à intercepter et sont généralement plus faciles à intercepter. les journaux et l'historique de votre navigateur Web. :)

(Ou, comme suggéré par les autres affiches, utilisez une méthode totalement différente, telle que l’authentification HTTP, une authentification digérée ou un système d’authentification de niveau supérieur tel que AD, LDAP, Kerberos ou Shib. Cependant, j’ai supposé que si vous n’aviez pas POST vous ne les auriez pas non plus.)

Autres conseils

Vous pouvez utiliser l'authentification HTTP, si elle est prise en charge.

Vous devez ajouter SSL, car toutes les méthodes, POST, GET et HTTP Auth (ainsi, sauf l'authentification Digest HHTP) envoient du texte en clair.

GET est fondamentalement juste comme POST, il a juste une limite sur la quantité de données que vous pouvez envoyer qui est généralement beaucoup plus petite que POST et une différence sémantique qui rend GET pas un bon candidat de ce point de vue, même si techniquement, ils peuvent le faire tous les deux.

À titre d’exemple, qu’utilisez-vous? Il y a beaucoup de choix en Python, comme le module cgi ou un framework comme Django, CherryPy, etc.

Avec un peu de JavaScript, vous pouvez demander au client de hacher le mot de passe entré et un nonce généré par le serveur, et de l'utiliser dans un HTTP GET.

Un bon choix: authentification HTTP Digest

Plus difficile à réussir, mais une option: Hachage côté client avec Javascript

Javascript est la meilleure option dans ce cas.

Parallèlement à la demande de nom d'utilisateur et de mot de passe, il envoie une chaîne aléatoire unique. Vous pouvez ensuite utiliser une bibliothèque javascript md5 pour générer un mot de passe haché, en combinant la chaîne aléatoire et le mot de passe [pwhash = md5 (randomstring + password)]. Le javascript instancie alors l'appel à http: //SERVER/ nom_utilisateur = nom_utilisateur & amp; random = RANDOMSTRING & amp; pwhash = 0123456789abcdef0123456789abcdef

Le serveur doit alors faire deux choses:   Vérifiez si la chaîne aléatoire a JAMAIS été utilisée auparavant et si c'est le cas, refusez la demande. ( très important pour la sécurité)

Recherchez le mot de passe en texte brut pour le nom d'utilisateur et faites md5 (chaîne aléatoire + mot de passe). Si cela correspond à ce que l'utilisateur a fourni dans l'URL en tant que pwhash, alors vous savez que c'est l'utilisateur.

La raison pour laquelle vous vérifiez si la chaîne aléatoire a déjà été utilisée auparavant est d'arrêter une attaque répétée. Si une personne peut voir le trafic réseau, l'historique du navigateur ou les journaux, elle peut simplement se reconnecter en utilisant la même URL, et peu importe qu'elle connaisse le mot de passe d'origine ou non.

Je vous recommande également de placer "Pragma: no-cache". et " Cache-Control: no-cache " en haut des en-têtes renvoyés par le script CGI, juste pour que la session authentifiée ne soit pas stockée dans le cache Web du navigateur ou de votre FAI.

Une solution encore plus sécurisée consisterait à utiliser le cryptage et le Challenge-Réponse appropriés. Vous indiquez votre nom d'utilisateur au serveur, le serveur renvoie un Challenge (une chaîne aléatoire chiffrée avec votre mot de passe) et vous indiquez au serveur quelle était la chaîne aléatoire. Si vous êtes capable de dire le serveur, alors évidemment vous avez le mot de passe et êtes qui vous dites que vous êtes! Kerberos le fait de cette façon, mais avec beaucoup plus de soin pour empêcher toutes sortes d'attaques.

La connexion sécurisée est très subjective. Une «sécurité» totale n'est pas facile à atteindre (si possible ... discutable). Cependant, vous pouvez vous en approcher.

Si le POST n’est pas une option, vous pouvez peut-être utiliser une méthode de sécurité d’annuaire telle que .htaccess ou l’authentification Windows en fonction du système sur lequel vous êtes.

Dans les deux cas précédents, vous obtiendrez la fenêtre contextuelle permettant de saisir un nom d'utilisateur et un mot de passe.

Pour utiliser POST comme méthode d'envoi des informations de connexion, il vous suffit d'utiliser un formulaire HTML avec method = " post " et récupérez les informations depuis, par exemple, une page PHP ou ASP, en utilisant la méthode $ _POST ["nomvar"] en PHP ou la méthode request.form ("varname") en ASP. Par exemple, à partir de la page PHP ou ASP, vous pouvez effectuer une recherche dans une base de données d'utilisateurs pour voir si cette combinaison nom d'utilisateur / mot de passe existe et, le cas échéant, les rediriger vers la page appropriée.

Comme référence, utilisez http://www.w3schools.com/ASP /showasp.asp?filename=demo_simpleform pour la partie HTML / ASP

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top