2008-08-28 23 views

Respuesta

59

httpOnly es compatible a partir de Tomcat 6.0.19 y Tomcat 5.5.28.

Ver la entrada changelog para el bug 44382.

El último comentario de errores 44382 estados, "esto ha sido aplicado a 5.5.x y se encontrará también en 5.5.28 en adelante." Sin embargo, no parece que se haya liberado 5.5.28.

La funcionalidad httpOnly se pueden habilitar para todas aplicaciones web en conf/context.xml:

<Context useHttpOnly="true"> 
... 
</Context> 

Mi interpretación es que también funciona para un contexto individual estableciéndola en la deseada Contexto entrada en conf/server.xml (de la misma manera que arriba).

+0

Estoy ejecutando Tomcat 5.5.36. Este atributo useHttpOnly parece funcionar solo para la cookie JSESSIONID. Agregué este indicador en todos mis contextos para asegurarme de que todas las cookies se agregarían al final "; HttpOnly". Sin embargo, solo JSESSIONID se vio afectado de la siguiente manera: 'Set-Cookie =' JSESSIONID = 25E8F ...; Path =/custompath; HttpOnly mycustomcookie1 = xxxxxxx; Path =/ mycustomcookie2 = 1351101062602; Path =/ mycustomcookie3 = 0; Path =/ mycustomcookie4 = 1; Ruta = /; Seguro mycustomcookie5 = 4000; Caduca = sáb, 22-oct-2022 17:51:02 GMT; Path =/ ¿Algo más estoy haciendo mal? –

+0

Esta documentación parece indicar que el indicador useHttpOnly solo se refiere a la cookie de identificación de sesión: http://tomcat.apache.org/tomcat-5.5-doc/config/context.html#Common_Attributes Creo que esto fue un paso intermedio medida destinada a proteger la cookie de sesión. La capacidad de marcar cookies como HttpOnly no formaba parte de las especificaciones de Servlet hasta 3.0 (cubierto por Tomcat 7): http://today.java.net/pub/a/today/2008/10/14/introduction-to- servlet-3.html # other-miscellaneous-changes –

9

Para las cookies de sesión todavía no parece ser compatible con Tomcat. Consulte el informe de error Need to add support for HTTPOnly session cookie parameter. Por ahora, se puede encontrar una solución algo complicada, here, que básicamente se reduce a parches manuales de Tomcat. Realmente no puedo encontrar una manera fácil de hacerlo en este momento, en este punto tengo miedo.

para resumir el trabajo en torno, se trata de la descarga del 5,5 source, y luego cambiar la fuente en los siguientes lugares:

org.apache.catalina.connector.Request.java

//this is what needs to be changed 
//response.addCookieInternal(cookie); 

//this is whats new 
response.addCookieInternal(cookie, true); 
} 

org.apache.catalina.connectorResponse.addCookieInternal

public void addCookieInternal(final Cookie cookie) { 
addCookieInternal(cookie, false); 
} 

public void addCookieInternal(final Cookie cookie, boolean HTTPOnly) { 

if (isCommitted()) 
return; 

final StringBuffer sb = new StringBuffer(); 
//web application code can receive a IllegalArgumentException 
//from the appendCookieValue invokation 
if (SecurityUtil.isPackageProtectionEnabled()) { 
AccessController.doPrivileged(new PrivilegedAction() { 
public Object run(){ 
ServerCookie.appendCookieValue 
(sb, cookie.getVersion(), cookie.getName(), 
cookie.getValue(), cookie.getPath(), 
cookie.getDomain(), cookie.getComment(), 
cookie.getMaxAge(), cookie.getSecure()); 
return null; 
} 
}); 
} else { 
ServerCookie.appendCookieValue 
(sb, cookie.getVersion(), cookie.getName(), cookie.getValue(), 
cookie.getPath(), cookie.getDomain(), cookie.getComment(), 
cookie.getMaxAge(), cookie.getSecure()); 
} 
//of course, we really need to modify ServerCookie 
//but this is the general idea 
if (HTTPOnly) { 
sb.append("; HttpOnly"); 
} 

//if we reached here, no exception, cookie is valid 
// the header name is Set-Cookie for both "old" and v.1 (RFC2109) 
// RFC2965 is not supported by browsers and the Servlet spec 
// asks for 2109. 
addHeader("Set-Cookie", sb.toString()); 

cookies.add(cookie); 
} 
19

Actualización: El material de JSESSIONID aquí es solo para contenedores más antiguos. Utilice la respuesta actualmente aceptada de jt a menos que esté utilizando < Tomcat 6.0.19 o < Tomcat 5.5.28 u otro contenedor que no admita HttpOnly cookies JSESSIONID como una opción de configuración.

Al configurar las cookies en su aplicación, utilice

response.setHeader("Set-Cookie", "name=value; HttpOnly"); 

Sin embargo, en muchas aplicaciones web, la cookie más importante es el identificador de sesión, que se establece de forma automática por el contenedor como la cookie JSESSIONID.

Si solo usa esta cookie, puede escribir un ServletFilter para volver a establecer las cookies en el camino de salida, forzando a JSESSIONID a HttpOnly. La página en http://keepitlocked.net/archive/2007/11/05/java-and-httponly.aspx http://alexsmolen.com/blog/?p=16 sugiere agregar lo siguiente en un filtro.

if (response.containsHeader("SET-COOKIE")) { 
    String sessionid = request.getSession().getId(); 
    response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid 
         + ";Path=/<whatever>; Secure; HttpOnly"); 
} 

pero tenga en cuenta que esto sobrescribirá todas las cookies y solo establecerá lo que indique aquí en este filtro.

Si utiliza cookies adicionales para la cookie JSESSIONID, deberá extender este código para establecer todas las cookies en el filtro. Esta no es una gran solución en el caso de las cookies múltiples, pero es quizás una solución rápida aceptable para la configuración solo de JSESSIONID.

Tenga en cuenta que a medida que su código evoluciona con el tiempo, hay un desagradable error oculto esperándolo cuando se olvida de este filtro y trata de establecer otra cookie en otro lugar de su código. Por supuesto, no se establecerá.

Esto realmente es un truco. Si usa Tomcat y puede compilarlo, eche un vistazo a la excelente sugerencia de Shabaz de aplicar el soporte de HttpOnly en Tomcat.

+8

Este código elimina el; Indicador seguro, lo que hace que el uso de https sea inútil. En –

+0

Servlet servidores de aplicaciones 3.0 de queja que puedo establecer el HttpOnly y banderas seguras para la cookie de sesión (JSESSIONID) añadiendo lo siguiente a la web.xml: cierto true

+0

@RogerJin publique esto como una nueva respuesta, esta respuesta de hace 6 años está cada vez más desactualizada. – Cheekysoft

14

Tenga cuidado de no sobrescribir el distintivo de cookie "; secure" en https-sessions. Este indicador evita que el navegador envíe la cookie a través de una conexión HTTP no encriptada, básicamente haciendo que el uso de https para solicitudes legítimas carezca de sentido.

private void rewriteCookieToHeader(HttpServletRequest request, HttpServletResponse response) { 
    if (response.containsHeader("SET-COOKIE")) { 
     String sessionid = request.getSession().getId(); 
     String contextPath = request.getContextPath(); 
     String secure = ""; 
     if (request.isSecure()) { 
      secure = "; Secure"; 
     } 
     response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid 
         + "; Path=" + contextPath + "; HttpOnly" + secure); 
    } 
} 
+2

Tenga en cuenta que el uso de 'request.isSecure()' no siempre es exacto. Considere un nodo de carga balanceada detrás del LB que realiza la aceleración de SSL. La solicitud del navegador al equilibrador de carga vendrá a través de HTTPS, mientras que la solicitud entre el equilibrador de carga y el servidor real vendrá a través de HTTP simple. Esto dará como resultado 'request.isSecure()' que es 'falso', mientras que el navegador usa SSL. – Anton

2

También hay que señalar que encender HttpOnly romperá applets que requieren acceso con estado de nuevo a la JVM.

las solicitudes http de Applet no usarán la cookie jsessionid y pueden asignarse a un tomcat diferente.

2

Para las cookies que establezco explícitamente, cambié para usar SimpleCookie proporcionado por Apache Shiro. No hereda de javax.servlet.http.Cookie por lo que se requieren más malabarismos para que todo funcione correctamente, pero sí proporciona un conjunto de propiedades HttpOnly y funciona con Servlet 2.5.

Para configurar una cookie en una respuesta, en lugar de hacer response.addCookie(cookie), debe hacer cookie.saveTo(request, response).

6

Si su servidor web Serlvet 3.0, como tomcat 7.0+, se puede utilizar más adelante en web.xml como:

<session-config> 
    <cookie-config> 
    <http-only>true</http-only>   
    <secure>true</secure>   
    </cookie-config> 
</session-config> 

como se menciona en documentos:

HttpOnly: especifica si cualquier sesión de seguimiento de cookies creadas por esta aplicación web será marcado como HttpOnly

Seguro: Especifica si hay cookies de seguimiento de sesión creadas por esta aplicación web será marcado como seguro, incluso si la petición que inició la sesión correspondiente está usando HTTP normal en lugar de HTTPS

favor refiérase a how to set httponly and session cookie for java web appliaction

0

En Tomcat6, puede activar de forma condicional de su escucha HTTP Clase:

public void contextInitialized(ServletContextEvent event) {     
    if (Boolean.getBoolean("HTTP_ONLY_SESSION")) HttpOnlyConfig.enable(event); 
} 

el uso de esta clase

import java.lang.reflect.Field; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import org.apache.catalina.core.StandardContext; 
public class HttpOnlyConfig 
{ 
    public static void enable(ServletContextEvent event) 
    { 
     ServletContext servletContext = event.getServletContext(); 
     Field f; 
     try 
     { // WARNING TOMCAT6 SPECIFIC!! 
      f = servletContext.getClass().getDeclaredField("context"); 
      f.setAccessible(true); 
      org.apache.catalina.core.ApplicationContext ac = (org.apache.catalina.core.ApplicationContext) f.get(servletContext); 
      f = ac.getClass().getDeclaredField("context"); 
      f.setAccessible(true); 
      org.apache.catalina.core.StandardContext sc = (StandardContext) f.get(ac); 
      sc.setUseHttpOnly(true); 
     } 
     catch (Exception e) 
     { 
      System.err.print("HttpOnlyConfig cant enable"); 
      e.printStackTrace(); 
     } 
    } 
} 
Cuestiones relacionadas