Posso implementare un sistema di autenticazione degli utenti Web in Python senza POST?

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

  •  09-06-2019
  •  | 
  •  

Domanda

La mia università non supporta il metodo POST cgi (lo so, è pazzesco) e speravo di poter avere un sistema in cui un utente possa avere un nome utente e una password e accedere in modo sicuro.È possibile?

Se non lo è, come lo faresti con POST?Solo per curiosità.

Saluti!

È stato utile?

Soluzione

Puoi effettivamente fare tutto con i metodi GET.Tuttavia, ti consigliamo di utilizzare un protocollo di risposta completo per gli accessi.(Puoi eseguire l'hash sul lato client utilizzando javascript.Devi solo inviare una sfida unica ogni volta.) Ti consigliamo inoltre di utilizzare SSL per garantire che nessuno possa vedere le stringhe mentre passano.

In un certo senso non esiste una reale differenza di sicurezza tra le richieste GET e POST poiché entrambe si presentano in chiaro, in altri sensi e nella pratica...GET è molto più facile da intercettare ed è presente nei registri della maggior parte delle persone e nella cronologia del browser web.:)

(Oppure, come suggerito dagli altri autori, utilizzare un metodo completamente diverso come l'autenticazione HTTP, l'autenticazione digest o uno schema di autenticazione di livello superiore come AD, LDAP, kerberos o shib.Tuttavia presumevo che se non avessi avuto POST non avresti nemmeno questi.)

Altri suggerimenti

Potresti utilizzare l'autenticazione HTTP, se supportata.

Dovresti aggiungere SSL, poiché tutti i metodi, POST, GET e HTTP Auth (beh, tranne l'autenticazione Digest HHTP) inviano testo in chiaro.

GET è fondamentalmente proprio come POST, ha solo un limite sulla quantità di dati che puoi inviare che di solito è molto più piccola di POST e una differenza semantica che rende GET non un buon candidato da quel punto di vista, anche se tecnicamente entrambi può farlo.

Per quanto riguarda gli esempi, cosa stai usando?Ci sono molte scelte in Python, come il modulo cgi o alcuni framework come Django, CherryPy e così via

Con un po' di JavaScript, potresti fare in modo che il client esegua l'hashing della password inserita e di un nonce generato dal server e lo utilizzi in un HTTP GET.

Una buona scelta: Autenticazione del digest HTTP

Più difficile da realizzare bene, ma un'opzione: Hashing lato client con Javascript

Javascript è l'opzione migliore in questo caso.

Insieme alla richiesta di nome utente e password, invia una stringa casuale univoca.È quindi possibile utilizzare una libreria javascript md5 per generare una password con hash, combinando la stringa casuale e la password [pwhash = md5(randomstring+password)].Il javascript crea quindi un'istanza della chiamata a http://SERVER/login.cgi?username=TheUsername&random=RANDOMSTRING&pwhash=0123456789abcdef0123456789abcdef

Il server deve quindi fare due cose:Controlla se la stringa casuale è MAI stata utilizzata prima e, in tal caso, nega la richiesta.(molto importante per sicurezza)

Cerca la password in testo semplice per il nome utente ed esegui md5(stringa casuale+password).Se corrisponde a ciò che l'utente ha fornito nell'URL come pwhash, allora sai che si tratta dell'utente.

Il motivo per cui controlli se la stringa casuale è mai stata utilizzata prima è fermare un attacco ripetuto.Se qualcuno è in grado di vedere il traffico di rete, la cronologia o i registri del browser, può semplicemente accedere di nuovo utilizzando lo stesso URL e non importa se conosce o meno la password originale.

Consiglio anche di inserire "Pragma:no-cache" e "Controllo cache:no-cache" nella parte superiore delle intestazioni restituite dallo script CGI, solo in modo che la sessione autenticata non venga archiviata nella cache web del browser o dell'ISP.

Una soluzione ancora più sicura sarebbe l’utilizzo di una crittografia adeguata e di Challenge-Response.Dici al server il tuo nome utente, il server restituisce una sfida (una stringa casuale crittografata con la tua password) e dici al server quale era la stringa casuale.Se riesci a dirlo al server, allora ovviamente hai la password e sei chi dici di essere!Kerberos lo fa in questo modo, ma con molta più attenzione per prevenire ogni tipo di attacco.

L'accesso sicuro è molto soggettivo.La piena "sicurezza" non è facile da raggiungere (se possibile... discutibile).Tuttavia puoi avvicinarti.

Se POST non è un'opzione, forse puoi utilizzare un metodo di sicurezza della directory come .htaccess o l'autenticazione di Windows a seconda del sistema su cui ti trovi.

Entrambi i passaggi precedenti ti apriranno la finestra pop-up che consente di inserire un nome utente e una password.

Per utilizzare POST come metodo per inviare le credenziali di accesso, dovresti semplicemente utilizzare un modulo HTML con metodo="post" e recuperare le informazioni, ad esempio, da una pagina PHP o ASP, utilizzando il metodo $_POST['varname'] in PHP o il metodo request.form("varname") in ASP.Dalla pagina PHP o ASP, ad esempio, puoi effettuare una ricerca in un database di utenti, per vedere se esiste quella combinazione nome utente/password e, in tal caso, reindirizzarli alla pagina appropriata.

Come riferimento, utilizzare http://www.w3schools.com/ASP/showasp.asp?filename=demo_simpleform per la parte HTML/ASP

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top