Supongo que está utilizando JSP.
Solo escape durante pantalla solamente. Allí para la etiqueta JSTL<c:out>
es perfectamente adecuado. Se escapa de las entidades HTML de forma predeterminada. Úselo para mostrar cada entrada controlada por el usuario, como URL de solicitud, encabezados de solicitud y parámetros de solicitud.
E.g.
<input type="text" name="foo" value="<c:out value="${param.foo}" />">
No es necesario el escape durante la entrada. XSS no daña en código Java sin procesar ni en bases de datos SQL. Por otro lado, también preferiría guardar los datos sin modificar en DB para que aún pueda ver lo que el usuario en realidad ingresó, para que pueda, si es necesario, realizar acciones sociales en los usuarios de mailicious.
Si desea saber de qué escapar durante la entrada, sería SQL injection. En tal caso, solo use PreparedStatement
en lugar de Statement
cuando quiera guardar cualquier entrada controlada por el usuario en la base de datos.
E.g.
create = connection.prepareStatement("INSERT INTO user (username, password) VALUES (?, MD5(?))");
create.setString(1, username);
create.setString(2, password);
create.executeUpdate();
El artículo de Joel Spolsky * Making Code Look Wrong * - http://www.joelonsoftware.com/articles/Wrong.html - trata sobre este tipo exacto de problema. – mob
Me gustó mucho ese artículo :) – Kyle
Bien leído de hecho. – pastapockets