Domanda:
Perché un controllo della complessità della password lato client non è considerato sicuro?
Marco Altieri
2017-04-27 12:46:54 UTC
view on stackexchange narkive permalink

Ho un'applicazione web e ho implementato un controllo sul browser per assicurarmi che un utente imposti solo password complesse. Una società che abbiamo chiamato per verificare le vulnerabilità di sicurezza ha sottolineato che questo non è sufficiente perché usando un po 'di hacking un utente può ignorare il controllo e impostare una password debole.

Non capisco come questa possa essere una vulnerabilità di sicurezza. Perché qualcuno dovrebbe hackerare il controllo di sicurezza solo per impostare una password debole? Qualcuno abbastanza esperto da hackerare l'applicazione web capirà l'importanza di utilizzare una password complessa.

L'unico motivo per cui posso pensare è che qualcuno, molto molto pigro, può decidere di hackerare il controllo solo per avere una password più facile da ricordare. Non so quanto sia probabile questo caso.

So che non puoi imporre una password complessa sul lato client e che se ti viene richiesto di avere una password complessa in qualsiasi circostanza, devi farlo lato server.

Il punto è: dato che, per avere un'esperienza utente accettabile, dobbiamo fare il controllo lato client, deve esserci una buona ragione, un caso d'uso reale che crea una possibile vulnerabilità per giustificare una duplicazione del controllo lato server.

Leggendo le risposte, finora, sembra che l'unico caso d'uso che può creare una vulnerabilità sia quando il javascript non funziona. Questo non sembra un problema per me perché il pulsante di invio è disabilitato per impostazione predefinita.

Puoi sempre chiedere chiarimenti a queste aziende.Chiedi loro uno scenario di attacco.Immagino sia un errore da parte loro.
Se hai gli stessi requisiti sia sul front end che sul back-end, non c'è confusione per i tuoi utenti e nessuna confusione per il tuo sistema.
Penso che non sia un duplicato dell'altra domanda perché chiede qualcosa di più specifico.Conoscevo già le risposte fornite in quella domanda.Sapevo che non è possibile applicare una password complessa sul lato client, ma volevo sapere in quali circostanze questa può essere una vulnerabilità di sicurezza.
Una considerazione che potrebbe esserti di aiuto è se è possibile eseguire lo stesso codice lato client come lato server o utilizzare un framework in cui crei la specifica di convalida una volta in una lingua ed è emessa al client tramite un testato e affidabiletrasformazione.Ad esempio, il JavaScript lato client per eseguire il controllo di resistenza potrebbe essere eseguito utilizzando Node sul lato server.Quindi riduci il tuo carico di codifica e assicurati che le implementazioni siano identiche per evitare strani problemi come gli utenti che ottengono errori che non sanno come risolvere.Infine, assicurati di testare il tuo javascript!
"Perché un controllo della password lato client non è considerato sicuro?"-> "Perché un controllo di ** sicurezza ** della password lato client non è considerato sicuro?"
Fai molta attenzione quando aggiungi controlli di password "forti".Le password meno sicure che uso sono quelle in cui ho dovuto manipolare la password per superare una serie di regole.I più sicuri sono quelli in cui ho detto a un generatore di password "20 caratteri: qualsiasi combinazione di lettere, numeri e caratteri speciali" e ho utilizzato direttamente il risultato.
Parte della risposta dipende da cosa * fai * con una password debole.Lo rifiuti?Avverti l'utente e gli permetti di impostarlo comunque?
Otto risposte:
Teun Vink
2017-04-27 13:28:39 UTC
view on stackexchange narkive permalink

Stai assumendo che il controllo sia stato aggirato di proposito. Potrebbe essere il caso che qualcuno stia usando un browser che non riesce a gestire lo script correttamente o con gli script disabilitati, forse anche senza saperlo.

Sembra che tu abbia un motivo per cui le persone usano password complesse. Se lo fai, perché accettare che le persone possano aggirarlo?

La convalida lato client può essere utile dal punto di vista dell'usabilità, ma se decidi che è richiesta una sicurezza minima della password, dovresti applicarla implementando lato server.

Esattamente.Se è usato più come linea guida, ma non è strettamente necessario, farlo sul client va bene.Per il mio sito "richiedo" agli utenti di avere una password più lunga di 5 caratteri, che non devono essere tutti numeri (data di nascita ...).Ma se il controllo non viene eseguito per qualche motivo, il server lo accetta perfettamente.A meno che tu non gestisca dati sensibili, dovrebbe andare bene.
OK.Nel mio caso se il javascript non funziona, il pulsante di invio non sarà abilitato.
@MarcoAltieri è banale bloccare i tuoi script ma usa ancora javascript per abilitare il pulsante di invio.Qualcuno potrebbe anche inviare manualmente alla destinazione del modulo.
@MarcoAltieri, una regola pratica che uso è presumere che un utente sufficientemente malizioso / incompetente non stia utilizzando affatto un browser e tutto ciò che farà è inviare richieste HTTP direttamente al mio backend indipendentemente da ciò che cerco di dirgli di fare.
Per indicare quanto sia banale il suggerimento di @fhl's - * L'ho fatto e non scrivo js o codice per il web in alcun modo *.Ho usato commenti selettivi di js in un browser (una convalida non valida che non sarebbe mai passata) e ho scritto uno script python per inviare un modulo senza browser (per mia comodità - una noiosa schermata del portale wifi).
@fhl La domanda è: perché qualcuno dovrebbe farlo?Solo per impostare una password debole?Sarebbe più facile per questa persona scrivere una password complessa e poi annotarla su un post-it, come qualcuno ha già sottolineato.
Il problema è più grande della semplice impostazione di una password debole.Il vero problema è che si dovrebbe presumere che la convalida lato client non venga eseguita.Sicuramente hai sentito parlare di SQL injection?E se impostano una password vuota?E se è così lungo da traboccare il database, consentendo l'iniezione di codice?E se ti aspettassi solo ASCII e inviassero un unicode disordinato?
@ftl Ovviamente ci sono controlli per altre vulnerabilità di sicurezza nella mia applicazione e sono lato server.I pentesteri non hanno trovato altri problemi, solo il controllo di password complesse.
@MarcoAltieri Potrei bypassare questo controllo o perché è troppo difficile creare una password che soddisfi i criteri della password complessa, o perché voglio una password semplice in modo da poter accedere più velocemente, o perché voglio usare la stessa password ovunque.
@MarcoAltieri Sono d'accordo sul fatto che non sia sbagliato permettere agli utenti di bypassare i controlli di complessità della passphrase in linea di principio (perché `La mia strada è troppo lunga per essere realisticamente una passphrase di esempio forzata che è totalmente più sicura di 123456` fallisce quasi tutti i controlli di convalida della complessità della passphrase ingenua che homai visto, eppure è molto meglio di `abc123! @ #` che supera quasi tutti i controlli di complessità delle passphrase che ho visto).Ma, per il tuo sito specifico, cosa conta di più: consentire un'attenta elusione informata o guidare gli ignoranti o negligenti il cui browser non esegue la convalida come previsto?
@mtraceur è impossibile che la password venga inserita se JavaScript non è abilitato o non funziona.
@MarcoAltieri Non sono sicuro di aver capito.Presumo che intendi dire che la tua pagina web è implementata in un modo che utilizza JavaScript per l'inserimento della password e non ha alcun graduale degrado a un semplice invio di moduli HTML tramite un HTTP POST?Anche se è così, è garantito che tutti gli interpreti JavaScript ora e in futuro funzioneranno correttamente?Non è una questione di sicurezza a quel punto, ma se l'ipotetica futura versione 99 di Firefox o qualsiasi altra cosa si interrompe in qualche caso particolare in modo tale che la tua convalida manchi uno dei criteri della tua passphrase ma altrimenti funziona bene, vuoi che il tuo server aiuti a individuare l'errore?
Serge Ballesta
2017-04-27 14:55:09 UTC
view on stackexchange narkive permalink

La regola quando si scrive un'applicazione server è semplicemente non fidarsi mai di ciò che viene dal client . I controlli effettuati lato client sono ottimi in quanto consentono una piacevole esperienza utente con bei popup e visualizzazione immediata. Ma poiché tutto può succedere, da un browser javascript disabilitato a un utente che utilizza un linguaggio di scripting per simulare un browser, tutti i controlli devono essere eseguiti (di nuovo) lato server.

Se si consigliano solo password complesse, fare cosa vuoi, se sono un requisito, devi implementare un controllo lato server.

BTW: tu come sviluppatore puoi proporre soluzioni, ma il cliente esprime i requisiti. Se non sei d'accordo con loro puoi chiedere chiarimenti e proporre altre modalità, ma alla fine deciderà il cliente.

nebulak
2017-04-27 13:19:43 UTC
view on stackexchange narkive permalink

Se l'utente DEVE impostare una password complessa, il controllo della sicurezza della password solo dal lato client rappresenta una vulnerabilità.

Esempio

Se lavori in una grande azienda e hai per cambiare la tua password ogni 2 o 3 mesi alcune persone inizieranno a bypassare il controllo lato client della forza della password per usare una password più corta o migliore per memorizzare le password.Se queste password vengono utilizzate per derivare chiavi crittografiche, ad esempio per la crittografia multiutente dei file, diventa orribile ...

Soluzione

Controlla sempre la sicurezza della password sul server e facoltativamente controlla la forza della password sul client per diminuire le richieste a il server.

Libreria consigliata: ZXCVBN

  • Utilizza la corrispondenza dei modelli e controlla le password più utilizzate per stimare la robustezza della password.
  • È disponibile in più linguaggi di programmazione
Stai dicendo che ci saranno utenti che si prenderanno davvero il tempo per hackerare il controllo solo per impostare una password debole?Mi sembra così improbabile.A proposito, mi piace la libreria che hai collegato!
Non so quanto sia critica questa vulnerabilità per la tua applicazione.Ma controllare la sicurezza della password sul server è la migliore pratica e non dovrebbe essere troppo lavoro da implementare.
I miei due centesimi: il controllo della sicurezza della password sul client è una funzionalità UX, non una funzionalità di sicurezza.Non fidarsi mai del client, quindi lo stesso controllo deve essere eseguito sul server a prescindere
Non convalidare mai nulla sul client!Mai!Puoi ** inoltre ** controllare l'input sul client per una maggiore usabilità, ma devi sempre convalidarlo sul server. Il client appartiene all'utente, quindi la convalida del solo client equivale a nessuna convalida ma dice semplicemente agli utenti che devono utilizzare una password complessa.Mi chiedo come funzionerebbe?
@MarcoAltieri l'intera cosa "devi impostare una nuova password che hai poche possibilità di ricordare" potrebbe essere progettata per far sì che i tuoi utenti cerchino soluzioni alternative.O post-it.Soprattutto se * la loro percezione * è che è una seccatura non eccesaria.
@MarcoAltieri alcuni utenti esperti potrebbero effettivamente spendere il loro tempo per aggirare i controlli che ritengono non necessari.Ho un sacco di script lato client (bookmarklet) che mi aiutano a navigare più facilmente nelle pagine o a compilare moduli di accesso per le demo dei clienti.
@Zefiro ma poiché sei un esperto, non utilizzerai questi script per impostare una password debole su un account reale.
@MarcoAltieri Lo farò.Ho una password "standard" che è molto debole che uso su tutti gli account che non hanno alcun valore per me.(Devi registrarti per visualizzare questa immagine e simili).Se il tuo account rientra in questa categoria ed è possibile ignorare il tuo controllo per utilizzare questa password, lo farò!Inoltre, è molto divertente.
Potrei, e forse vorrei, forse solo per il gusto di mostrare quello che penso di regole stupide per account che non apprezzo molto, e voglio usare la mia password "drago" ovunque.Quindi la decisione per te è: incoraggiare buone password o FARLE?In quest'ultimo caso non hai altra scelta che un secondo controllo sul server.
Stevoisiak
2017-04-27 20:26:21 UTC
view on stackexchange narkive permalink

Basandosi sulla risposta di Teun Vink, ci sono alcuni scenari del mondo reale in cui un utente può accidentalmente aggirare il controllo di sicurezza.

Supponiamo che un utente scarichi un blocco degli annunci come Adblock Plus o uBlock Origin . Quindi, a causa dell'errata configurazione degli script, uno di questi adblock blocca accidentalmente lo script che stavi utilizzando per verificare la sicurezza della password. Ora l'utente può inserire 1234 come password senza alcun controllo lato server per impedirlo.

O in alternativa, forse la memorizzazione nella cache locale ha dato il utilizza una versione precedente del tuo script. Forse hanno salvato la tua pagina web come file HTML statico sul desktop. Forse il PC dell'utente ha un virus che ha alterato il contenuto del tuo script. Come dice il detto comune ...

Non fidarti mai dell'utente.

Modifica: Vedi anche " Impossibile salvare il profilo quando maps.googleapis.com è bloccato" per un ottimo esempio del motivo per cui non dovresti mai fidarti dell'utente.

Se il javascript è bloccato, il pulsante di invio non sarà abilitato perché è disabilitato per impostazione predefinita.
@MarcoAltieri Adblock non funziona bloccando JavaScript nella sua interezza.Funziona bloccando *** script specifici *** come definito dall'utente.
Sembra improbabile che adblock sarà in grado di eseguire selettivamente parti del mio script finendo per abilitare il pulsante anche se il controllo non è stato eseguito.È tutto nella stessa sceneggiatura.
@MarcoAltieri Sono d'accordo.Lo scenario che ho descritto è molto improbabile.In effetti, *** improbabile *** è la parola chiave qui.Quando si considera la sicurezza, se c'è la possibilità che accada qualcosa, anche se è estremamente improbabile, in genere si desidera assicurarsi che il sistema sia preparato se ciò accade.
Ma l'utilizzo delle risorse di Google nella tua pagina non è comunque una cattiva pratica?
@wannabeLearner - Non se utilizzi [integrità subresource] (https://en.wikipedia.org/wiki/Subresource_Integrity)
@paj28 sì, questo lo renderebbe sicuro.Ma se nel tuo paese è in atto un blocco contro i servizi di proprietà di Google, questo non rovinerebbe ancora le cose?
@wannabeLearner - Mi aspetto che le librerie ospitate da Google vengano trattate in modo diverso dai servizi di Google, ma non ne sono sicuro.Potresti fare una nuova domanda su questo
@paj28 lo sono.Anche SE è un dolore da usare in paesi come la Cina (riferendosi a un'esperienza passata che forse avevo già risolto SE)
Volevo dire che * non * vengono trattati allo stesso modo
user3742898
2017-04-28 00:01:28 UTC
view on stackexchange narkive permalink

Dici che sia il controllo & che l'abilitazione del pulsante di invio sono uno script, quindi è sicuro anche se alcuni script vengono caricati e altri no. Quanto sei sicuro che queste due funzioni saranno sempre nello stesso script?

Suppongo che quello che sto dicendo è che suona come, allo stato attuale delle cose, significherebbe che qualcuno intenzionalmente fa qualcosa che sa essere una cattiva idea per ottenere una cattiva password, e tu sei d'accordo con quello; stai cercando di prevenire gli incidenti, non la stupidità intenzionale.

La cosa che mi preoccupa è che se questo script viene riformattato, & si divide, o la stupidità intenzionale diventa il tuo problema, o qualche utente malintenzionato scrive un lato client script apparentemente per aiutare le persone, ... allora sei nei guai.

rackandboneman
2017-04-28 01:29:54 UTC
view on stackexchange narkive permalink

Un possibile problema è che basta un solo saggio (che potrebbe essere abbastanza informato da usare quella tecnica per usare una password che non supera il controllo ed è comunque sicura!) per trovare un modo per hackerarlo - e distribuire l'hack a poche altre persone (che probabilmente ritiene abbastanza responsabili) che alla fine lo daranno a persone contro la cui mancanza di competenza in materia di sicurezza avrebbe dovuto difendere la soluzione.

Questo sembra un caso reale che può creare una vulnerabilità.Grazie
njzk2
2017-04-27 19:54:04 UTC
view on stackexchange narkive permalink

Applica le regole sul server

Qualunque sia la regola che imposti, devono essere applicate a livello di server in ogni caso. Questo è vero per l'impostazione della password e per i campi obbligatori nei moduli, ad esempio (ad esempio, se un numero di telefono è richiesto al momento della registrazione, dovrebbe essere controllato nel server).

Aiuta il tuo utente sul client

Qualunque siano le regole che imponi sul server, dovresti aiutare il tuo utente il più possibile fornendo aiuto al client.

Può essere solo una spiegazione, stelle accanto ai campi obbligatori, che mostrano errori prima di inviare moduli, ...

Ma applica le regole sul server

Ma in ogni caso, non puoi fare affidamento sul client. Alcune persone bloccheranno JS. Alcune persone bloccheranno il flash. Ad un certo punto potresti aprire la tua API a terze parti, che potrebbero o meno far rispettare le tue regole per te.

Io, per esempio, a volte ho riattivato i pulsanti bloccati da JS perché ho trovato quel client - le regole applicate erano ridicole (es. la tua password deve contenere esattamente 8 caratteri, inclusi esattamente 1 lettera maiuscola, 1 numero e 1 carattere speciale solo in (! @ # $% & *?)), sperando che il server non li applicasse regole (cosa che spesso non accadeva).

Se le tue specifiche devono avere un insieme preciso di regole sulla password dei tuoi utenti, avere il lato client di convalida non soddisfa le specifiche.

paj28
2017-04-27 23:21:38 UTC
view on stackexchange narkive permalink

Mi aspetto che l'azienda di pen test stia applicando un principio generale qui "fai tutta la convalida lato server" senza considerare il caso specifico in modo molto dettagliato.

Nel tuo scenario, in cui JavaScript non può essere disabilitato, io non vedere alcun rischio pratico per la sicurezza. Potrebbe esserci un rischio non tecnico se sono necessarie password complesse per un requisito normativo (ad esempio PCI-DSS).



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...