2011-05-04 12 views
12

Usamos jspx como motor de plantilla. Tenemos docenas de pantallas con cientos de expresiones el como $ {user.firstName} o "$ {mail.subject}"Escape de entidades HTML en JSP/JSPX: ¿no hay solución para el problema que ni siquiera debería existir?

Y todo este código HTML no se escapa de manera predeterminada. . Si hubiera algo con < o "en el campo - pantalla fallará Siempre podemos usar fn: escapeXml pero si lo hace en todos los lugares muy aburrido

1) Hace hay una manera de hacerlo de escape de manera predeterminada. ?

La única forma que conozco es modificar JSP compilador (como Jasper para Tomcat). Pero no es un camino a seguir.

2) por qué alguien puede necesitar HTML sin escape en el? Almacenamiento de código HTML fuera de la plantilla (en la base de datos, por ejemplo) no es una buena práctica.

3) Estoy seguro de que el motor de plantillas debería manejarlo automáticamente (como lo hizo en XSLT), ¿por qué debería importarle al usuario? El escape manual (fn: escapeXml) huele a SQL manual escaping (que se utiliza en lugar de JDBC setParam): código repetitivo y buen lugar para inyección sql (scripts de sitios cruzados en nuestro caso).

Respuesta

10

1) ¿Hay alguna forma de escapar por defecto?

No en la cosecha JSP. Su sucesor Facelets, sin embargo, escapa de ellos por defecto. La única forma de desactivar el escape es usar <h:outputText value="#{bean.foo}" escape="false" /> en lugar de #{bean.foo}.


2) ¿Por qué alguien puede necesitar HTML sin escapar en El? Almacenar HTML fuera de la plantilla (en la base de datos, por ejemplo) no es una buena práctica.

Almacenar sanitized Sin embargo, HTML se hace con más frecuencia. P.ej. para permitir un pequeño subconjunto de etiquetas HTML inocentes como <p>, <b>, <i> y en el que los atributos on* ya están desprotegidos.


3) Estoy seguro de motor de la plantilla debe manejar de forma automática (como lo hace en XSLT), ¿por qué la atención del usuario respecto? El escape manual (fn: escapeXml) huele a SQL manual escaping (que se utiliza en lugar de JDBC setParam): código repetitivo y buen lugar para sql-injection (cross-site scripting en nuestro caso).

JSP es una tecnología de visión antigua. No es realmente un motor de plantilla flexible.

inyecciones SQL son por lo general debe evitarse sólo por el uso PreparedStatement en lugar de Statement (o mediante el uso de un marco ORM en lugar de "JDBC en bruto", al igual que como su problema de XSS puede evitarse sólo por el uso de un marco MVC en lugar de "prima JSP ").


En cuanto a su problema concreto, así, puede resolver este básicamente en 4 formas:

  1. de tripas corazón y reemplazar toda la plantilla de texto EL-en-el que vuelve a mostrar la entrada controlada por el usuario por fn:escapeXml() o <c:out> y enséñese a usted mismo y a su equipo a prestar atención a esto en el futuro. Sugerencia, un IDE un poco decente como Eclipse tiene un archivo de búsqueda y reemplazo basado en expresiones regulares en todos los archivos.

  2. Tiene un tipo de interceptor DB que elimina HTML malicioso antes de insertarlo en DB. Si es necesario, ejecute un script DB para desinfectar los datos existentes. Sin embargo, esto es más una solución alternativa que una solución real.

  3. Reemplace la resolución JSP EL por una personalizada que escapa todo el HTML. Sin embargo, esto tiene la desventaja de que nunca se puede mostrar HTML sin formato por EL siempre que sea realmente necesario.

  4. usen una estructura MVC decente con HTML incorporado escapar. Sin embargo, esto es más trabajo que solo arreglar las expresiones EL individuales.

+0

Gracias! Usamos struts + jspx, no queremos usar caras, es una tecnología diferente. 1) Utilizamos intellij idea y podemos reemplazar todos los elementos pero no nos gusta de esta manera. 2) escaparse es un problema VER y debe ser resuelto en la capa de vista, no en la base de datos. 3) Para hacerlo, necesito hackear mi contenedor. Puedo registrar mi ELResolver personalizado, pero se usará en cadena, no puedo deshabilitar ni ajustar todos los demás resolvedores (ni siquiera tengo punteros para ellos: JSP EL API es muy mala). 4) Usamos puntales. Utiliza ServletDispatcher para resolver vistas de jsp. Podemos jugar con él, pero no estoy seguro de que funcione. –

+1

Luego muerde la bala. Por eso te pagan. Aprende la lección para la próxima vez. – BalusC

+0

Creo que hay una quinta opción que podría agregar, que no es usar JSP, sino una tecnología de visualización diferente como Scalate, Velocity o Freemaker. Para esos lenguajes de plantillas es más fácil hacer cosas transversales. –

Cuestiones relacionadas