Estoy trabajando en la prevención de cross site scripting (XSS) en una aplicación web basada en Java, Spring. Ya he implementado un filtro de servlet similar a este ejemplo http://greatwebguy.com/programming/java/simple-cross-site-scripting-xss-servlet-filter/ que desinfecta toda la entrada en la aplicación. Como medida de seguridad adicional, me gustaría también desinfectar todo el resultado de la aplicación en todos los JSP. Hice algunas investigaciones para ver cómo se podía hacer esto y encontré dos opciones complementarias.Alternativa al uso de c: out para evitar XSS
Uno de ellos es el uso del atributo defaultHtmlEscape
de Spring. Esto fue muy fácil de implementar (unas pocas líneas en web.xml), y funciona muy bien cuando su salida está pasando por una de las etiquetas de primavera (es decir, mensaje o etiquetas de formulario). La otra opción que he encontrado es no usar directamente expresiones EL como ${...}
y usar <c:out value="${...}" />
Ese segundo enfoque funciona perfectamente, sin embargo, debido al tamaño de la aplicación en la que estoy trabajando (más de 200 archivos JSP). Es una tarea muy engorrosa tener que reemplazar todos los usos inapropiados de expresiones EL con la etiqueta c:out
. También se convertiría en una tarea engorrosa en el futuro asegurarse de que todos los desarrolladores cumplan con esta convención de usar la etiqueta c:out
(sin mencionar cuánto más ilegible sería el código).
¿Hay alguna forma alternativa de evitar la salida de expresiones EL que requerirían menos modificaciones de código?
No utilice 'fn: escapeXml' para escapar de HTML.Generará ''', que no es una entidad HTML estándar. –
@Roland: no, no es así. Genera ''' que es válido tanto en HTML como en XML (al igual que 'c: out'). – BalusC
Ah, eso es genial. Así que debo haber confundido con alguna otra función 'escapeXml'. Para estar seguro, lo busqué en la especificación JSTL, donde esto se menciona explícitamente. –