2015-12-14 13 views
12

Ich habe gerade recherchiert, warum die Verwendung eval() Funktion ist schlecht und ich fand einen Grund, anfällig für Code-Injektion Angriffe (Post: Why is using the JavaScript eval function a bad idea?).Warum sollten wir Code Injection in Javascript beachten?

Aber meine Frage ist, müssen wir unbedingt über die Code-Injektion in Javascript besorgt sein? Wenn ein Benutzer ein JS-Skript für eine Website ausführen möchte, kann er dies tun, indem er in der Konsole ausgeführt wird.

Also, ich frage mich nur, was für zusätzlichen Schaden es tun kann, wenn jemand erfolgreich ist, seinen Code in meinen Javascript-Code zu injizieren?

EDIT
Basierend auf Antwort des Oleander unten, ich einen Weg, der Verwundbarkeit gefunden, wenn wir die Kommunikation zwischen dem Browser und dem Server über AJAX aufruft. Das macht vollkommen Sinn. Aber ich habe vielleicht Javascript-Programme, die nur im Browser laufen und keine Kommunikation zum Backend haben, zum Beispiel einen Rechner oder ein einfaches Spiel. Also meine Zusatzfrage, gibt es irgendeinen anderen Grund, der diese Programme angreifbar machen kann?

+1

Code-Injektionen sind schädlich, wenn sie von jemand anderem als dem Benutzer gemacht werden. Sind Sie sicher, dass Ihr Benutzer der einzige ist, der das Argument des 'eval' kontrolliert? – Bergi

+0

Wenn ich über das Javascript rede, sollte es der Benutzer sein, der nur die Eingaben (in Formularen) ändern kann. Ich bin mir über keinen anderen Weg sicher.Hast du noch ein mögliches Beispiel? –

+0

@TareqMahmood Ich postete ein Beispiel – Oleander

Antwort

4

Sicherheitsprobleme treten auf, wenn ein Hacker schädlichen Code in eine JSON-Anfrage eingibt, die von einem Benutzer erstellt wurde und die dann mit eval ausgewertet wird.

Stellen Sie sich vor der folgende Code lief wird

$.get("/get.json", function(data){ 
    var obj = eval(data) // String to javascript object 
}); 

Die Ressource wie folgt aussieht

GET /get.json 
{ 
    some: "data" 
} 

Aber ein Angreifer ersetzt die oben mit einem jetzt man in the middle attack

function(){ 
    // send window.cookie to attacker 
}(); 

Der Angreifer mit Zugriff auf die Benutzersitzung haben.

+0

Danke. Ich verstehe es jetzt. Aber mein ursprüngliches Denken war über ein JS-basiertes Frontend-Spiel oder einen Taschenrechner, der keine Kommunikation mit dem Server verwendet. Glauben Sie, dass in diesen Programmen möglicherweise ein Risiko besteht? –

+0

@TareqMahmood es ist immer eine Best Practice, Best Practices zu befolgen. Wenn Sie es sich zur Gewohnheit machen, Kürzungen vorzunehmen oder nicht im Voraus über mögliche Sicherheitsauswirkungen Bescheid zu wissen, werden Sie diese Praktiken fortsetzen, wenn Sie in ein Server/Client-Projekt einsteigen. Die Funktion 'eval()' dient dazu, auf den Javascript-Compiler zuzugreifen und wird fälschlicherweise in einer Vielzahl von Situationen verwendet. Beachten Sie, dass eval auch eine schlechte Leistung hat. –

+0

@TareqMahmood Ich könnte falsch liegen, aber ich bin ziemlich sicher, dass dies nichts mit einem "Mann in der Mitte Angriff" zu tun hat. –

2

Nun, wenn Ihr Code einen Wert aus der Query-Zeichenfolge nimmt und in einem Eval verwendet, könnte ein Angreifer sein Opfer dazu verleiten, die URL zu besuchen, die den bösen Query-String enthält.

Von OWASP:

<script> 
function loadObj(){ 
var cc=eval('('+aMess+')'); 
document.getElementById('mess').textContent=cc.message; 
} 

if(window.location.hash.indexOf('message')==-1) 
    var aMess="({\"message\":\"Hello User!\"})"; 
else 
    var aMess=location.hash.substr(window.location.hash.indexOf('message=')+8); 
</script> 

Der Angreifer kann eine E-Mail senden Link oder umleiten einen Benutzer den Besuch ihrer bösartigen Website an die URL

http://example.com/page.html?message=<img onerror="alert(xss)"> 

Dann haben Sie eine DOM basierten XSS-Angriff enthält.

Wenn sich Ihr Spiel ohne Back-End auf einer Website mit anderen vertraulichen Informationen befindet, z. B. Benutzersitzungen, ist es möglicherweise möglich, dass der Angreifer Sitzungscookies stiehlt oder Anmeldedaten einholt. Es hängt alles davon ab, auf was das JavaScript zugreifen kann. Das heißt, es hat vollen Zugriff auf seine Hosting-Domain, da die Same-Origin-Richtlinie darauf beschränkt ist. Wenn Sie jedoch andere sensible Anwendungen hier haben, könnten sie kompromittiert werden. Wenn nicht, kann der Angreifer im schlimmsten Fall das Vertrauen eines Nutzers in Ihre Website missbrauchen, indem er Inhalte ändert oder überwacht, was Nutzer auf Ihrer Website tun.

+0

Sinn macht. Vielen Dank! –

+0

Aber mein anderer Punkt war, über die mögliche Bedrohung zu wissen, wenn wir nur mit Benutzereingaben arbeiten. Wir haben möglicherweise vertrauliche Informationen in Cookies. Was aber, wenn wir eval nicht für URL-Parameter verwenden, sondern nur für Benutzereingaben. Zum Beispiel ein Taschenrechner, bei dem der Benutzer zwei Zahlen eingibt, und wir fügen zwischen ihnen durch die Verwendung der Eval-Funktion hinzu/sub/mul/div. –

+1

Das ist einer der Fälle, in denen 'eval()' akzeptabel wäre. Es ist, wenn, sagen wir, später, Permalink-Funktionalität zu bestimmten Gleichungen, dass dies ein Problem sein würde 'example.com? Calc = 4 + 4' (' 4 + 4' URL-Komponente codiert natürlich). – SilverlightFox