without secure only flag cookie java security cookies xss httponly

java - flag - owasp cookie secure httponly



¿Cómo se configuran las cookies de HttpOnly en webapps de tomcat/java? (8)

Actualización: las cosas de JSESSIONID aquí son 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.

Cuando configure cookies en su aplicación, use

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 el contenedor configura automáticamente como la cookie JSESSIONID.

Si solo usa esta cookie, puede escribir un ServletFilter para restablecer 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 usa cookies adicionales para la cookie JSESSIONID, deberá extender este código para configurar 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.

Después de leer la publicación del blog de Jeff sobre Protegiendo tus cookies: HttpOnly . Me gustaría implementar las cookies de HttpOnly en mi aplicación web.

¿Cómo le dices a Tomcat que use solo las cookies de http para las sesiones?


En Tomcat6, puede habilitar condicionalmente desde su clase de escucha HTTP:

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

Usando 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(); } } }


Para las cookies de sesión, aún no parece ser compatible con Tomcat. Consulte el informe de errores. 44382 . Por ahora, se puede encontrar una solución algo complicada, 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 proceso, se trata de descargar la source 5.5 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); }


Para las cookies que estoy configurando explícitamente, SimpleCookie 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) .


Si su servidor web es compatible con la especificación Serlvet 3.0, como tomcat 7.0+, puede utilizar a continuación en web.xml como:

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

Como se menciona en los documentos:

HttpOnly : especifica si las cookies de seguimiento de sesión creadas por esta aplicación web se marcarán como HttpOnly

Seguro : especifica si las cookies de seguimiento de sesión creadas por esta aplicación web se marcarán como seguras, incluso si la solicitud que inició la sesión correspondiente usa HTTP simple en lugar de HTTPS.

Consulte cómo configurar httponly y la cookie de sesión para la aplicación web java


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); } }


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

Consulte la entrada del changelog para la falla 44382.

El último comentario para el error 44382 dice: "esto se ha aplicado a 5.5.x y se incluirá en 5.5.28 en adelante". Sin embargo, no parece que se haya liberado 5.5.28.

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

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

Mi interpretación es que también funciona para un contexto individual al configurarlo en la entrada de contexto deseada en conf / server.xml (de la misma manera que la anterior).


también debe tenerse en cuenta que al encender HttpOnly se romperán los applets que requieren acceso de estado de nuevo a jvm.

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