Posso sostituire nome utente e password con un testo casuale lungo nell'URL? [duplicare]

8

Scenario

Un cliente si trova ad affrontare un problema con i suoi utenti: utilizzano un servizio (web) alcune volte all'anno e dimenticano le proprie credenziali molto spesso . Esiste una procedura standard di recupero della password, ma molti di loro chiamano semplicemente il servizio clienti ogni volta (chiedendo loro di generare una determinata password ). Questo ha poche implicazioni negative:

  • Il personale del servizio clienti conosce tutte le password.
  • Gli utenti mantengono il servizio clienti occupato (e quando non è orario di lavoro queste chiamate sono costose per il cliente).

Nota che:

  • Gli utenti possono cambiare le proprie credenziali in qualcosa di significativo, ma semplicemente non gli interessa perché usano questo servizio solo due o tre volte all'anno, quindi vogliono ottenere le cose nel modo più rapido possibile.
  • Aggiungere una casella di controllo "ricordami" non è un'opzione perché è (in questo caso) vietato dalla legge.
  • Il sito memorizza informazioni mediche molto delicate.
  • Il cliente vuole risparmiare denaro, quindi i dispositivi hardware (come lettori di smart card e / o lettori di impronte digitali) non sono un'opzione.

Domanda

Per risolvere questi problemi il cliente mi chiede di generare un ID univoco per ciascun utente, questo ID può essere aggiunto all'URL per autenticare automaticamente quell'utente. Ad esempio:

link

Gli utenti possono decidere di salvare questo ID dove preferiscono (link sul desktop, preferiti del browser, annotarlo su un post-it) ma il cliente stesso non è responsabile per questo (ricorda che non possiamo fornire un "ricordami "funzionalità a causa della legge).

Non sto parlando di un token di autenticazione (memorizzato come cookie al posto di username e password tuple, come discusso Perché usare un token di autenticazione al posto del nome utente / password per richiesta? ) ma un parametro URL.

Supponendo che:

  • Questo token generato automaticamente è abbastanza lungo (diciamo 30 ~ 60 caratteri) e casuale casuale (stringa alfanumerica con caratteri maiuscoli).
  • Vengono utilizzate misure di sicurezza di base (ritardi molto lunghi per i token sconosciuti e la blacklist IP).
  • Conserverei questi ID separatamente dalle credenziali normal , hashed (ovviamente) e con un algoritmo / parametri diversi dalle password (a causa della sua lunghezza potrebbe anche essere più semplice o ho ancora bisogno di bcrypt?!)
  • Il parametro viene rimosso dall'URL dopo l'autenticazione e l'utente viene reindirizzato.

C'è qualche altro problema di sicurezza che non immagino? Questo rende l'autenticazione troppo debole?

I possibili problemi a cui posso pensare sono che gli URL sono memorizzati nella cronologia del browser ...

Modifica

Un po 'più di contesto: il cliente manterrebbe la propria lista di token fissi (non modificabili) associati agli utenti. Appena prima di usare il suo servizio, invierebbe a tutti loro un'e-mail con il link indicato (e-mail e-mail generate in gruppo). Nel mio esempio il protocollo è HTTP ma in realtà è HTTPS (anche se non ho alcun controllo su questo).

Domanda aggiuntiva: l'aiuto temporaneo per questo token? Ogni volta che viene inviata una nuova e-mail, viene generato un nuovo token (con una scadenza relativamente breve, una o due settimane).

    
posta Adriano Repetti 03.12.2015 - 13:31
fonte

4 risposte

18

Anche se l'entropia in un grande token casuale suggerisce che il token sarebbe un meccanismo di autenticazione sicuro, ci sono molti problemi ad esso associati:

  • Il token è fisso per utente, quindi un utente non può cambiare il token se sospetta che sia stato compromesso.
  • Il token potrebbe essere utilizzato un numero illimitato di volte, il che aumenta l'opportunità di scendere a compromessi.
  • In base alla descrizione, il cliente può conoscere i token per i suoi dipendenti. Sebbene i dati possano essere uguali (o avere le stesse restrizioni di accesso) per ogni account gestito dal cliente, questo compromette il non ripudio . Il cliente potrebbe utilizzare un account dipendente e nessuno sarebbe più saggio.

Esiste un problema di processo

Come hai sottolineato, avere clienti che chiamano il servizio clienti per cambiare una password ha due problemi significativi:

  • In primo luogo, è inefficiente per la tua attività e sta costando denaro ai tuoi affari e ai tuoi clienti.
  • In secondo luogo, è pericoloso dal punto di vista della sicurezza.

Considera in che modo consentire al servizio clienti di reimpostare le password influisce sulla sicurezza dell'applicazione:

  • Qualsiasi rappresentante del servizio clienti può reimpostare la password (e in base a come la descrivi, in realtà impostare la password) di qualsiasi account cliente e può quindi accedere alle informazioni riservate dell'account del cliente.
  • A seconda delle procedure per la reimpostazione della password avviata dal telefono, il processo potrebbe essere suscettibile all'ingegneria sociale.

Utilizza il token casuale per avviare una reimpostazione della password

I clienti che devono modificare la propria password devono utilizzare l'applicazione Web esistente per richiedere la reimpostazione della password. Ciò potrebbe richiedere l'invio di una e-mail all'account e, facoltativamente, una serie di domande di sicurezza (in base alla propria valutazione dei rischi). Successivamente un link di reimpostazione della password con un token casuale viene inviato via email a tale indirizzo email. Questo link dovrebbe essere valido una sola volta e dovrebbe scadere dopo un breve periodo di tempo se non utilizzato. Quando l'utente fa clic sul collegamento, vengono autenticati. La maggior parte delle app web avrà l'utente di impostare una password a questo punto. Nel tuo caso, potresti voler consentire all'utente di saltare l'impostazione di una password, dato che lo dimenticheranno comunque.

I clienti che chiamano il servizio clienti per reimpostare la propria password dovrebbero essere istruiti a utilizzare la funzione di reimpostazione della password. Il rappresentante del servizio clienti può rimanere sulla linea e accompagnare il cliente attraverso la procedura, ma il punto chiave è che il cliente si resetta da solo. Una volta che un cliente reimposta una password, è meno probabile che effettui nuovamente la chiamata.

    
risposta data 03.12.2015 - 15:48
fonte
15

Questo è quasi equivalente al passaggio della password come parametro GET, che è male. È discusso qui: Esiste una differenza tra GET e POST per la sicurezza delle applicazioni Web?

Inoltre, nel tuo URL di esempio non stai utilizzando HTTPS. Anche l'invio della password in chiaro sulla rete è negativo per ovvi motivi.

Quindi, un utente può modificare il proprio token nel caso in cui sia compromesso? Sei sicuro che non perderanno questo token? Voglio dire, potrebbero anche solo scrivere la loro password.

In alternativa, puoi utilizzare l'autenticazione di base su HTTPS. Questa è una tecnica di autenticazione standard e può essere scritta sotto forma di un URL come link . Dubito che verrà salvato come segnalibro, ma la maggior parte dei browser dovrebbe offrire una funzione "ricorda queste credenziali".

    
risposta data 03.12.2015 - 14:15
fonte
6

Lo schema proposto corrisponde fondamentalmente a OWASP 2 e il più pericoloso problema di sicurezza delle applicazioni Web: autenticazione e sessione non funzionanti gestione . Il sito di OWAPS spiega abbastanza bene il problema:

Airline reservations application supports URL rewriting, putting session IDs in the URL: http://example.com/sale/saleitems?sessionid=268544541&dest=Hawaii

An authenticated user of the site wants to let his friends know about the sale. He e-mails the above link without knowing he is also giving away his session ID. When his friends use the link they will use his session and credit card.

Considera inoltre che ogni URL digitato da un utente può essere inviato al suo creatore di browser e / o al motore di ricerca preferito (vedere Norme sulla privacy di Google Chrome ).

    
risposta data 03.12.2015 - 16:53
fonte
4

Questa è un'espansione sulla risposta di amccormack .

Permetti al cliente di avviare un accesso inserendo il suo indirizzo email. Quando hanno inserito l'indirizzo email, utilizzalo per convalidare che l'utente è autorizzato ad accedere, quindi invia un token singolo e di breve durata all'indirizzo e-mail dell'utente. Potrebbe essere nel forma di un collegamento web con opportuni nonce, o una chiave che l'utente deve copiare in un campo sul modulo successivo (login stile wizard). Convalida che il token inserito corrisponde a quello inviato per quell'indirizzo e che è ancora valido. Assicurati di consentire alcune ore di validità iniziale in caso di greylisting, ma anche solo monouso in modo che un token non possa essere riutilizzato.

In questo caso, l'utente non dovrà ricordare nulla di speciale per il proprio servizio (è necessario solo il proprio indirizzo email e l'accesso a tale account di posta elettronica) e lo schema non è probabilmente meno sicuro di qualsiasi altro reset puro - schema password per e-mail che puoi trovare.

Inoltre, in futuro, puoi estenderlo consentendo la consegna di token tramite SMS (o qualsiasi altro canale di consegna che puoi immaginare), con modifiche minime a tutto tranne il codice di consegna del token.

    
risposta data 03.12.2015 - 16:43
fonte

Leggi altre domande sui tag