Pregunta

Después de leer la publicación del blog de Jeff en Protegiendo sus cookies:Sólo Http.Me gustaría implementar cookies HttpOnly en mi aplicación web.

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

¿Fue útil?

Solución

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

Ver el registro de cambios entrada para el error 44382.

El último comentario sobre el error. 44382 declara: "Esto se ha aplicado a 5.5.x y se incluirá en 5.5.28 en adelante". Sin embargo, no parece que se haya lanzado 5.5.28.

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

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

Mi interpretación es que también funciona para un contexto individual al configurarlo en el nivel deseado. Contexto entrada en conf/servidor.xml (de la misma manera que arriba).

Otros consejos

Actualizar:Las cosas de JSesionID 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 admite las cookies Httponly JSessionID como una opción de configuración.

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

Si solo usa esta cookie, puede escribir un ServletFilter para restablecer las cookies al salir, forzando a JSESSIONID a HttpOnly.la pagina 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 configurará lo que indique aquí en este filtro.

Si utiliza cookies adicionales a 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 múltiples cookies, pero quizás sea una solución rápida aceptable para la configuración de solo JSESSIONID.

Tenga en cuenta que a medida que su código evoluciona con el tiempo, habrá un error oculto desagradable esperándole cuando se olvide de este filtro e intente configurar otra cookie en algún otro lugar de su código.Por supuesto, no se configurará.

Sin embargo, esto realmente es un truco.Si usa Tomcat y puede compilarlo, eche un vistazo a la excelente sugerencia de Shabaz para parchear el soporte HttpOnly en Tomcat.

Tenga cuidado de no sobrescribir el indicador de cookie ";seguro" en las sesiones https.Este indicador evita que el navegador envíe la cookie a través de una conexión http no cifrada, lo que básicamente hace que el uso de https para solicitudes legítimas sea inútil.

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

Para las cookies de sesión, todavía no parece ser compatible con Tomcat.Ver el informe de error Es necesario agregar soporte para el parámetro de cookie de sesión HTTPOnly.Por ahora se puede encontrar una solución algo complicada. aquí, que básicamente se reduce a parchear manualmente Tomcat.Realmente no puedo encontrar una manera fácil de hacerlo en este momento, me temo.

Para resumir la solución, implica descargar la versión 5.5 fuente, y luego cambie 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);
}

Si su servidor web admite la especificación Serlvet 3.0, como Tomcat 7.0+, puede utilizarlo 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:

Sólo Http:Especifica si alguna cookies de seguimiento de sesión creada por esta aplicación web se marcará como httponly

Seguro:Especifica si alguna cookies de seguimiento de sesión creada por esta aplicación web se marcará como segura incluso si la solicitud que inició la sesión correspondiente está utilizando HTTP simple en lugar de HTTPS

Por favor refiérase a cómo configurar httponly y cookie de sesión para la aplicación web java

También debe tenerse en cuenta que activar HttpOnly romperá los subprogramas que requieren acceso con estado al jvm.

las solicitudes http del subprograma no utilizarán la cookie jsessionid y pueden asignarse a un gato diferente.

Para las cookies que estoy configurando explícitamente, cambié a usar galleta simple proporcionado por apache shiro.No hereda de javax.servlet.http.Cookie, por lo que se necesita un poco más de malabarismo para que todo funcione correctamente; sin embargo, 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) necesitas hacer cookie.saveTo(request, response).

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

Encontré en OWASP

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

Esto también soluciona el problema de seguridad "httponlycookies en la configuración".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top