2013-08-12 9 views
7

Molti sviluppatori ritengono che il metodo eval() di JavaScript debba essere evitato. Questa idea ha senso dal punto di vista del design. Viene spesso utilizzato come brutta soluzione quando è disponibile un'opzione più semplice e migliore.Sfruttare il metodo eval() di JavaScript

Tuttavia, non capisco le preoccupazioni sulle vulnerabilità della sicurezza. Certamente, l'esecuzione di eval() consente all'hacker di eseguire qualsiasi codice JavaScript che è possibile eseguire.

Ma non possono farlo comunque? In Chrome, almeno, gli Strumenti per sviluppatori consentono all'utente finale di eseguire il proprio codice JavaScript. In che modo eval() è più pericoloso degli Strumenti per sviluppatori?

+2

Questo non è * "il consenso comune" *. Molti sviluppatori esperti sono infastiditi dal FUD riguardo a "eval". La * "eval è malvagia" * probabilmente non viene mai detta oggi da esperti programmatori. Se sei stupido, potrebbe essere pericoloso. Ma di solito è solo lento, brutto e porta a un codice difficile da evolvere. –

+0

Ora, non vedo come questa domanda possa ricevere una buona risposta ... –

risposta

11

Come accennato B-Con, l'autore dell'attacco non è quello seduto al computer, quindi potrebbe utilizzare lo eval() già nel tuo script come mezzo per passare codice dannoso al tuo sito al fine di sfruttare la sessione dell'utente corrente in qualche modo (ad es. un utente che segue un collegamento dannoso).

Il pericolo di eval() è quando viene eseguito su valori non autorizzati e può portare a una vulnerabilità DOM Based XSS.

ad es. considerare il seguente codice nel tuo HTML (piuttosto artificiosa, ma dimostra la questione spero)

<script> 

eval('alert("Your query string was ' + unescape(document.location.search) + '");'); 

</script> 

Ora, se la stringa di query è ?foo si ottiene semplicemente una finestra di avviso che indica quanto segue: Your query string was ?foo

Ma cosa questo codice consentirà all'utente di eseguire il reindirizzamento degli utenti dal proprio sito a un URL come http://www.example.com/page.htm?hello%22);alert(document.cookie+%22, dove www.example.com è il tuo sito web.

Questa modifica il codice che viene eseguito da eval() a

alert("Your query string was hello"); 
alert(document.cookie+""); 

(Nuove linee da me per chiarezza). Ora questo potrebbe fare qualcosa di più dannoso che mostrare il valore corrente del cookie, in quanto il codice richiesto viene semplicemente passato sulla stringa di query dal link dell'attaccante in forma codificata. Ad esempio, potrebbe inviare il cookie al dominio dell'utente malintenzionato in una richiesta di risorsa, consentendo il sequestro della sessione di autenticazione.

Si applica a qualsiasi valore da utente/input esterno non salvato ed eseguito direttamente nello eval(), non solo nella stringa di query come mostrato qui.

+0

Questo ha senso. Stavo pensando che 'eval()' ha permesso l'hacking nel sito stesso, piuttosto che consentire ad altri siti di analizzare i dati degli utenti. –

+0

Non direttamente, ma potrebbe essere eseguito se un utente amministratore è stato scelto come target. – SilverlightFox

2

Un utente malintenzionato non ha accesso agli Strumenti per sviluppatori del browser dell'utente. L'autore dell'attacco non è probabilmente l'utente seduto al computer.

Il pericolo di eval() è che un utente malintenzionato può essere in grado di manipolare i dati che vengono infine eseguiti tramite eval() in altri modi. Se la stringa eval() proviene da una connessione HTTP, l'utente malintenzionato può eseguire un attacco MITM e modificare la stringa. Se la stringa proviene da una memoria esterna, l'autore dell'attacco potrebbe aver manipolato i dati in quella posizione di archiviazione. Etc.

+2

Il vero problema è la stringa proveniente da qualsiasi fonte fornita dall'utente.L'attacco MITM sarà sempre un problema, i concetti di "eval". Se stanno facendo MITM, possono modificare il normale payload JS non evaled con la stessa facilità. – Matt

+1

Un altro classico esempio è "eval'ing Le variabili GET sono un modo semplice per aprire i fori XSS. Ecc. –