2009-07-17 14 views
12

Forse il titolo è mal formulato ma non riusciva a pensare a un modo migliore di dirlo.Quanto è sicuro inviare una password in testo semplice usando AJAX?

Attualmente sto lavorando su un sistema di login (niente di formale, solo sperimentazione) e stavo pianificando di usare PHPLiveX (una libreria AJAX) per alcune funzionalità. Fondamentalmente si creano alcune funzioni PHP che vengono poi chiamate tramite JavaScript. È possibile aggiungere parametri (getElementById) al codice JavaScript trasferito alla funzione PHP.

Quello che volevo veramente sapere è se è sicuro chiamare la funzione da JavaScript senza crittografare prima la password, quindi lasciare che la funzione PHP la cripta (SHA256 in questo caso). I dati trasferiti tramite AJAX possono essere intercettati? Se sì, quanto è probabile questo?

+0

Qual è il modo migliore per garantire ciò, a parte l'utilizzo di SSL? Se fosse possibile hash una password in JavaScript, questa è una soluzione realizzabile? – j82374823749

+1

Se si hash la password in JavaScript, sarà comunque visibile a chiunque stia annusando il traffico (sarà solo un hash!) Un utente malintenzionato potrebbe banalmente rigiocare questa richiesta con la password hash in esso –

+0

E SSL risolverà questo problema? – j82374823749

risposta

45

Non più o meno sicuro di un normale richiesta HTTP POST rilasciato da un browser (come in da un <form>)

"Fix" per questo è lo stesso "fix" per i non-AJAX richieste - usa SSL.

+0

Buona risposta, grazie. Quindi non ci sono buchi di sicurezza che riguardano esclusivamente AJAX? – j82374823749

+4

Dannazione, sono in ritardo di 5 secondi. –

+0

Oppure risposta alla sfida, vedere la mia risposta. –

1

Le chiamate AJAX sono semplicemente richieste HTTP.

Si comporta come una normale richiesta HTTP e viene fornito con tutti i vantaggi e gli svantaggi. Non è più sicuro.

Per rendere il vostro chiamate AJAX al sicuro, ci sono diversi modi si può provare:

  1. Usa SSL. SSL crittograferà i messaggi tra l'utente e il server. Lo svantaggio di SSL è che dovrai pagare una tariffa aggiuntiva per i certificati SSL validi. I certificati SSL non validi quando sono utilizzabili, non forniscono lo stesso livello di garanzia di sicurezza agli utenti.
  2. Crittografa le richieste prima di essere inviate, lato client. Ad es .: password degli utenti hash prima di essere inviata in rete. La maggior parte delle volte, non è comunque necessaria la password di testo in chiaro degli utenti. Questo non è utilizzabile quando gli utenti non consentono l'esecuzione di script sul lato client.
  3. E a parte le informazioni fuorvianti comuni in cui il POST è più sicuro di GET, non lo è. Entrambi sono ugualmente aperti agli attaccanti per vedere.
+0

-1: risposta fuorviante. AJAX fa la stessa richiesta di un semplice vecchio modulo. –

+0

E quale parte della mia risposta che dice "AJAX NON fa la stessa richiesta di un semplice vecchio modulo"? –

+0

@Adrian: In realtà, sono le informazioni mancanti che rendono qualcuno che non ha quella conoscenza per presumere che sia in qualche modo diverso. –

7

Se si invia la password tramite AJAX o tramite un modulo normale, viene comunque inviata tramite una richiesta HTTP POST (si spera). Quindi non stai aggiungendo o rimuovendo nulla dal punto di vista della sicurezza.

L'unico modo per impedire a qualcuno di intercettare la password è utilizzando SSL (tramite AJAX o no).

1

Questo è solo sicuro come avere un form di login che non è SSL essere spedito via cavo, come quasi tutti i forum là fuori!

0

Non è sicuro. Non inviare password non crittografate. È molto probabile che verranno intercettati a un certo punto e avrai un grosso problema.

Questo è un esempio video di acquisizione di una password telnet. Telnet manda un messaggio in chiaro e questo illustra chiaramente il problema principale che hai se pensi di farlo. Qualsiasi script kiddie a due bit può intrappolare una password in testo semplice più velocemente di quanto tu possa così "Oh mio Dio, dov'è finito il mio database?"

+1

Cura di fornire fatti che confermano la tua opinione? –

1

Assicurati che la destinazione della tua chiamata AJAX sia una pagina HTTPS attendibile: // e l'hai resa altrettanto sicura delle altre mandate delle stesse informazioni che sta facendo il resto della tua applicazione. La maggior parte delle librerie/framework non ti limita a solo HTTP: // per le tue chiamate AJAX.

0

Lo si sta inviando in chiaro, quindi chiunque abbia lo sniffing/listening/etc, la rete del client sarà in grado di vedere facilmente la password. La chiamata AJAX è solo un semplice vecchio messaggio HTTP. Se vuoi vedere questo in azione, accendi una copia di wireshark e fai la tua richiesta. Sarai in grado di vedere la password nel pacchetto HTTP.

1

Sì, può essere letto. Proprio come tutto il resto senza un qualche livello di sicurezza (Vedi SSL)

Per vederlo, esegui uno strumento come WireShark mentre esegui i comandi AJAX.

Quanto è probabile? Non molto, ma la password dell'utente verrà probabilmente salvata nei file di registro di qualcuno in testo normale. Se qualcuno lo avesse trovato, allora potrebbe essere una brutta notizia. Tornato al college, la mia classe di networking aveva accesso ad alcuni router (semi) fantasiosi. Abbiamo avuto incarichi in cui ci siamo registrati per account su siti web casuali. Mentre facevamo questo, abbiamo notato alcune cose molto spaventose sui file di log nei router. Questo mi ha aperto gli occhi per pensare a come ogni tracciamento è tracciato e molto probabilmente registrato da qualche parte.

20

Come altri hanno già detto, non è più pericoloso che inviare un messaggio HTTP da un modulo. In effetti, è la stessa cosa.

Ma se HTTPS non è un'opzione, è sempre possibile utilizzare uno schema di richiesta/risposta su una connessione non crittografata. Fondamentalmente funziona così:

  • Il server ha uno SHA (o qualsiasi algoritmo di hashing che si preferisce) hash della password dell'utente.
  • Il client ha la password.
  • Le richieste dei client (utilizzando in chiaro AJAX) che il server di inviare una sfida (una stringa casuale di byte; caratteri vanno bene.)
  • Server crea una sfida e un ID di sfida, e la salva con una scadenza.
  • Il cliente riceve la sfida e l'ID della sfida.
  • Client hash la password utilizzando SHA.
  • Il client esegue l'hash risultante con la sfida aggiunta in qualche modo.
  • Il client invia l'ID sfida (non la sfida stessa) e il secondo hash risultante.
  • Il server cerca la sfida usando l'ID se esiste e non è scaduto.
  • Il server accoda la richiesta all'hash della password memorizzata e crea un hash utilizzando lo stesso schema del client.
  • Il server confronta l'hash con il client.Se è lo stesso, l'utente è autenticato.

In realtà è piuttosto semplice da configurare una volta ottenuta l'idea. Wikipedia ha alcune informazioni aggiuntive su di esso.

EDIT: ho notato ho dimenticato di dire, se l'autenticazione va a buon fine si necessario eliminare la sfida, a prescindere. Dare al cliente più tentativi su una sfida potrebbe portare a problemi di sicurezza.

+2

+1: Adoro questa tattica. – Jeremiah

+0

Sembra un buon metodo. Vorrei alcune opinioni della gente su quanto è sicuro rispetto all'autenticazione tradizionale (basta acquistare nome utente e password)? – j82374823749

+4

Quanto è sicuro rispetto al solo invio di nome utente e password come testo normale? Bene, se si attribuisce il valore di 0 a quel metodo, e il mio approccio è un po 'n> 0 (ad esempio .0005 anche, per ragioni di discussione) il mio metodo è> 1,000,000,000,000,000,000 volte più sicuro. –

0

Come già accennato, SSL è la soluzione migliore qui. Tuttavia, si potrebbe hash la password sul lato client. Se cerchi google, troverai moltissime implementazioni javascript di md5.

0

dannazione voi ragazzi mi preoccupate. SSL non protegge dall'attacco MITM dell'avvelenamento dell'arp. Sarebbe fatale adorare SSL come voi. È necessario disporre di un modo per crittografare la password sul lato client prima di effettuare anche un solo salto o anche un nuovo hacker sarà in grado di intercettare la password in chiaro

+1

Penso che questo sarebbe più adatto come commento. –

0

Si dovrebbe anche essere molto consapevoli delle potenziali vulnerabilità di sicurezza durante la costruzione un'applicazione che utilizza Ajax.

Il seguente sito ha alcune davvero buone informazioni per quanto riguarda l'Ajax e XSS o XSRF Attacchi http://www.isecpartners.com/files/isec-attacking_ajax_applications.bh2006.pdf

Non dimenticare che quando si effettua una funzione remota accessibile a una chiamata javascript, un utente potrebbe semplicemente indovinare la funzione di chiamalo e modificalo per fare le sue offerte.

Problemi correlati