Haga seguro al operador $ {} XSS en Struts 2 (igual que el tapiz)

Como se menciona en http://www.disasterarea.co.uk/blog/xss-vulnerabilities-in-web-frameworks-2/

El $ {} no es seguro en xss struts 2, mientras que es seguro en tapiz 5.

No soy un tipo de Tapiz, pero quiero saber si lo anterior es correcto.

Por lo que yo sé, ${} es parte de JSLT y no depende de ningún framework web. Entonces, si la oración anterior es correcta y el ${} es XSS seguro en el tapiz, ¿cómo podemos hacerlo seguro en puntales 2?

Actualizado:

Para probarlo, ejecuto la aplicación struts2-showcase, modelDriven\modelDrivenResult.jsp abierto modelDriven\modelDrivenResult.jsp y añado la siguiente línea:

 Am I safe ${name} 

Ahora cuando ejecutas el caso de la demostración e ingresas alert('xxxx') como nombre de gangester, ¡puedes ver la alerta!

  1. Struts2 se escapa automáticamente de forma predeterminada;
  2. JSTL se escapa automáticamente de forma predeterminada;
  3. JSP EL ${name} NO se escapó.

Puede escapar explícitamente con ${fn:escapeXml(name)} , o establecer el escape que se realizará de forma predeterminada creando un ELResolver personalizado como se describe en este gran artículo:

  • ELResolver escapa de los valores JSP EL para evitar secuencias de comandos entre sitios

Respuesta corta: asegúrela a la entrada de la aplicación o en el camino a la capa de visualización.

El ${} Tapestry es seguro porque no está usando JSP / JSP EL. No escapar cosas es una de las cosas que pierdes al usar los ${} JSP EL sobre cosas como y así sucesivamente.