Struts2 y Spring esos grandes y peligrosos amigos

Es muy normal utilizar Strut2 junto con Spring pero esto puede tener algunos problemas de seguridad. Vamos a abordar alguno de ellos imaginandonos un escenario típico.
Aplicación web con dichos frameworks en la cual Spring se encarga de instanciar los action como singleton y en la cual inyecta una serie de valores, pensemos en una propiedad tipo "private String urlBuscador" con su getter y su setter públicos. si utilizamos archivos de configuracion xml, veríamos el típico

<property name="urlBuscador"> http://www.google.es</property>

al instanciar el action.
Esta forma de proceder es cómoda.... pero peligrosa ¿por qué?.

Por otro lado existe una interceptor en Struts2 que se encarga comunicar los jsp con los action. Esto es, coge los parametros de la llamada y los intenta inyectar en propiedades del action. Con un parámetro "usuario.nombre=andres" intentará encontrar una propiedad usuario con un campo nombre en el cual "meter" el valor 'andres' .
En principio sólo le deberian llegar al action los parámetros que nosotros hayamos metido en los jsp. Pero, y ahí está el problema, nada impide que un pícaro usuario no cree una url http://www.gaudioso.com/app/buscar.action?urlBuscador=http://www.bing.com . El resultado sería desastroso, habrían sobreescrito el valor que hemos intruducido mediante spring.
Existen varias formas de solucionar esta vulnerabilidad. La primera es no haciendo públicas más propiedades de las estrictamente necesarias, después una buena arquitectura de capas puede ayudarnos enormente, una tercera forma es inyectar con spring via contructor del action, así evitamos tener getter/setter publicos ya que estos getter/setter son los que utiliza struts y hay algún interceptor de struts que también puede ayudarnos "com.opensymphony.xwork2.interceptor.ParameterFilterInterceptor" que filtra los parámetros de llegada.

Comentarios