2010-01-27 8 views
13

Wie kann ich sicherstellen, dass ich nicht zweimal etwas entgeht?Escaping von HTML in Java

Ich habe gehört, dass es gute Praxis, um Werte zu entkommen, wie Sie sie von einem Formular erhalten, und auch entkommen, wenn Sie ausgeben. Auf diese Weise haben Sie zwei Chancen, etwas zu fangen.

+5

Joel Spolsky ist * Making Code Look Wrong * Artikel - http://www.joelonsoftware.com/articles/Wrong.html - ist über diese genaue Art von Problem. – mob

+0

Ich mochte diesen Artikel wirklich :) – Kyle

+0

Gut gelesen in der Tat. – pastapockets

Antwort

18

Ich nehme an, dass Sie JSP verwenden.

Nur entkommen während Anzeige nur. Dort ist das JSTL<c:out> Tag perfekt geeignet. Es entkoppelt standardmäßig HTML-Entities. Verwenden Sie diese Option, um alle benutzergesteuerte Eingaben anzuzeigen, z. B. Anforderungs-URL, Anforderungsheader und Anforderungsparameter.

z.

<input type="text" name="foo" value="<c:out value="${param.foo}" />"> 

während der Eingabe Flüchten ist nicht erforderlich. XSS schadet weder in Java-Code noch in SQL-Datenbanken. Auf der anderen Seite würden Sie auch lieber Daten unverändert in DB speichern, damit Sie immer noch sehen können, was der Benutzer eigentlich eingegeben hat, damit Sie bei Mailicious-Usern ggf. soziale Aktionen durchführen können.

Wenn Sie wissen möchten, was während der Eingabe zu entkommen ist, wäre es SQL injection. Verwenden Sie in diesem Fall einfach PreparedStatement anstelle von regulär Statement, wenn Sie beliebige benutzergesteuerte Eingabe in der Datenbank speichern möchten.

z.

create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))"); 
create.setString(1, username); 
create.setString(2, password); 
create.executeUpdate(); 
+0

Ich bin jetzt davon überzeugt, nur während der Anzeige zu entkommen. Ich frage mich, warum Spring das 'defaultHtmlEscape' für Formulare hat? – Kyle

+0

@Spines: Framework Bloat? –

+0

Ist das nicht eine Option, um "htmlscape" standardmäßig zu setzen ... und htmlscape bedeutet, dass es Werte in das endgültige html-Formular schreiben wird maskiert? So etwas wie helios

3

Sie sollten nur html kodieren, wenn Sie etwas an einen Browser ausgeben. Dies verhindert XSS-Angriffe. Die Art von Escaping, die Sie tun, wenn Sie Daten aus einem Formular sammeln, bevor Sie es in eine Datenbank einfügen, ist nicht HTML-Codierung. Es entkommt spezielle Datenbankzeichen (am besten mit parametrisierten Abfragen). Der Zweck besteht darin, SQL-Injection-Angriffe zu verhindern. Es gibt also keine Doppelcodierung.

2

Inhalt, der in einem Kontext harmlos ist, kann in einem anderen Kontext gefährlich sein. Der beste Weg, Injektionsattacken zu vermeiden, besteht darin, den Inhalt vorzubereiten, bevor er in einen anderen Kontext übergeben wird. In Ihrem Fall ändert HTML-Text seinen Kontext, wenn er an den Browser übergeben wird. Der Server rendert nicht den HTML-Code, sondern der Browser. Achten Sie darauf, keinen schädlichen HTML-Code an den Browser zu senden und ihn vor dem Senden zu maskieren.

Ein weiteres Argument dafür ist, dass es möglich sein könnte, dass der Angriffscode innerhalb der Anwendung aus zwei oder mehr Eingaben zusammengesetzt wird. Jeder der Eingänge war harmlos, aber zusammen können sie gefährlich werden.