2010-02-16 5 views
8

Parece una pregunta estúpida a la que la respuesta sería "¡No use codificarURL()!" pero estoy trabajando con una base de código que usa etiquetas de anclaje netui en los JSP y necesito deshabilitar la escritura de JSESSIONID en las URL, ya que es un riesgo para la seguridad.Cómo configurar Tomcat para no codificar la identificación de la sesión en la URL cuando se invoca HttpServletResponse.encodeURL()

En WebLogic, puede configurar esto configurando url-rewriting-enabled en weblogic.xml (lo sé porque escribí esa característica en el servidor de WebLogic). Sin embargo, no puedo encontrar una opción de configuración equivalente para Tomcat.

+0

Si se tiene en cuenta que tiene el ID de sesión en la URL, un riesgo de seguridad, entonces ¿cómo se puede confiar en la misma información en una cookie con menos riesgo? – skaffman

+2

Uno podría (inconscientemente/accidentalmente) copiar una URL con 'jsessionid' de la barra de direcciones y dársela a otra persona. El otro, ya sea inconscientemente o con conocimiento y con malas intenciones, podría solicitar la página con esta URL como si fuera el usuario original. Con las cookies, el 'jsessionid' no es directamente visible para el usuario final. También vea http://en.wikipedia.org/wiki/Session_fixation – BalusC

+0

Eso no suena como seguridad, eso es más un problema de seguridad. Si la seguridad contra los exploits es la preocupación, entonces una cookie no es más segura que una URL reescrita, seguramente. – skaffman

Respuesta

5

No viene a la mente ninguna configuración. Pero esto es bastante fácil de hacer creando una primera entrada Filter escuchando en el url-pattern de interés (quizás /*?) Y reemplaza el ServletResponse por una implementación HttpServletResponseWrapper donde el encodeURL() devuelve el mismo argumento sin modificar.

Kickoff ejemplo:

public void doFilter(ServletRequest request, ServletResponse response) throws ServletException, IOException { 
    chain.doFilter(request, new HttpServletResponseWrapper((HttpServletResponse) response) { 
     public String encodeURL(String url) { 
      return url; 
     } 
    }); 
} 
+3

Muéstremelo ... recuerde, sin embargo, hay 4 métodos diferentes de reescritura de URL en la respuesta, algunos o todos los cuales pueden necesitar "deshabilitar". – skaffman

+2

Correcto. 2 de ellos están en desuso (terminando en 'Url' en lugar de 'URL'). El otro que quizás desee anular también es 'codireRedirectURL()'. También vea http://java.sun.com/javaee/5/docs/api/javax/servlet/http/HttpServletResponse.html#encodeRedirectURL%28java.lang.String%29 – BalusC

+0

¡Gracias! Eso es exactamente lo que hice para Tomcat y puedo confirmar que funciona. –

9

Tomcat 6 soporta el atributo disableURLRewriting que se puede ajustar a true en su elemento Contexto:

http://tomcat.apache.org/tomcat-6.0-doc/config/context.html#Common_Attributes

+1

Otra propiedad a considerar es httpOnly, que impide que las secuencias de comandos del lado del cliente accedan a la ID de la sesión. –

+0

Si está utilizando http y no https y ha establecido secure = "true" en el conector de tomcat, entonces no se podrá establecer disableURLRewriting en true. – yeaske

Cuestiones relacionadas