2013-10-30 10 views
5

Ich habe ein HTML-Textfeld in meiner Benutzeroberfläche (für eine Java-basierte Webanwendung), in dem ein Benutzer einen beliebigen Wert eingeben kann. Sobald es gespeichert ist, wird es in der Textfläche (die deaktiviert ist) im Browser angezeigt.Ist ein XSS-Angriff möglich, wenn ein Skript in einem HTML-Textfeld angezeigt wird?

Wenn ein Benutzer ein Skript als Freitext in das Textfeld eingibt, wird es als Skript ausgeführt (auch wenn der Wert in der TextArea angezeigt wird und nicht als Label/Text)?

+0

Lassen Sie uns Ihren Code sehen. –

Antwort

4

Das hängt davon ab, wie Sie den Wert der setzen. Im HTML-Code ist der Inhalt des textarea der Text innerhalb des Elements.

Ich habe ein JSFiddle to demonstrate verschiedene Möglichkeiten geschaffen, den Inhalt eines mit einem Skript innerhalb Dadurch entstehen zwei textarea Elemente textarea

<div><textarea id="e1"></textarea></div> 
<div><textarea id="e2"></textarea></div> 
<div id="e3"/> 

var dangerous = '<scri' + 'pt>alert("Danger!");</scri' + 'pt>'; 
document.getElementById('e1').value = dangerous; 

document.getElementById('e2').innerHTML = dangerous; 

dangerous = '</textarea>' + dangerous; 
var content = '<textarea>' + dangerous + '</textarea>'; 
document.getElementById('e3').innerHTML = content; 

console.log('Done.'); 

zu ändern (speichern) und einen leeren.

Im letzten Test schließe ich die textarea in der Eingabe und dann das Skript anhängen. Interessanterweise ist die Einstellung innerHTML in diesem Fall sicher zu verwenden: It doesn't execute scripts inserted in this way.

So lange wie Sie es in JavaScript tun, sind Sie ziemlich sicher. Aber in der Regel, können Sie das DOM der Seite auf dem Server übertragen und dann müssen Sie sicherstellen, dass Sie richtig den Inhalt der textarea weil entkommen:

String unfilteredInput = "</textarea><script>alert(\"Danger!\");</script>"; 

out.write("<textarea>"); 
out.write(content); 
out.write("</textarea>"); 

wird das Skript ausführen.

Hinweis: Ich habe auch versucht, document.write() zu demonstrieren, aber das ist in einem JSFiddle nicht erlaubt. Ich bin mir ziemlich sicher, dass document.write() für den gleichen Angriff anfällig ist.

+1

+1 Ja, es hängt davon ab, ob es serverseitig oder clientseitig eingestellt ist, obwohl du recht hast, ist auch 'document.write()' anfällig. Ein schnelles Beispiel hier: https://dl.dropboxusercontent.com/u/1075151/dwrite.htm (funktioniert in Chrome). – SilverlightFox

Verwandte Themen