cookie - httpsession java
¿Cookie http solo con seguridad de primavera y servlet 2.5? (3)
Creo que te falta la etiqueta de seguridad. Prueba agregar:
<secure>false</secure>
Quiero que mi cookie sea segura y solo solicite http.
He visto muchos mensajes como este y parecen funcionar bien, pero usando archivos de configuración y servlet +3.
Lo que básicamente quiero hacer es configurar mi cookie http solo y (si es posible) también ssl.
Hasta ahora he agregado esto a mi web.xml
<session-config>
<session-timeout>60</session-timeout>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
<tracking-mode>COOKIE</tracking-mode>
</session-config>
no hace nada, por lo que estaba leyendo, también tengo que configurar mi servlet.xml para habilitar esta característica, pero no sé cómo ...
¿Alguna idea de cómo hacer esto?
EDITAR:
Como estoy utilizando servlets 2.5, la configuración xml no es una opción, ¿quizás un filtro?
Los cambios context.xml mencionados por javagc solo reconfigurarán su cookie de sesión.
Para cambiar todas sus cookies, tiene 2 opciones:
Opción 1) Actualice su código de aplicación para agregar cookies utilizando un método más seguro. Ejemplo: https://.com/a/30488471/95674
Opción 2) Puede configurar un filtro de servlet para cambiar TODAS las (otras) cookies que ingresan a través del sistema. Agregue estas 2 clases en el paquete apropiado en su WAR. Luego actualice su web.xml como se detalla a continuación.
Hay un ejemplo más simple de la Opción 2 que figura en el sitio OWASP, si está dispuesto a agregar una dependencia en las bibliotecas OWASP. Eso se encuentra aquí: https://www.owasp.org/index.php/HttpOnly#Using_Java_to_Set_HttpOnly
Contenedor de respuesta
Esto agrega el indicador de solo http a todas las cookies en la respuesta envuelta.
public class HttpOnlyResponseWrapper extends HttpServletResponseWrapper {
public HttpOnlyResponseWrapper(HttpServletResponse res) {
super(res);
}
public void addCookie(Cookie cookie) {
StringBuilder header = new StringBuilder();
if ((cookie.getName() != null) && (!cookie.getName().equals(""))) {
header.append(cookie.getName());
}
if (cookie.getValue() != null) {
// Empty values allowed for deleting cookie
header.append("=" + cookie.getValue());
}
if (cookie.getVersion() == 1) {
header.append(";Version=1");
if (cookie.getComment() != null) {
header.append(";Comment=/"" + cookie.getComment() + "/"");
}
if (cookie.getMaxAge() > -1) {
header.append(";Max-Age=" + cookie.getMaxAge());
}
} else {
if (cookie.getMaxAge() > -1) {
Date now = new Date();
now.setTime(now.getTime() + (1000L * cookie.getMaxAge()));
SimpleDateFormat cookieFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz");
header.append(";Expires=" + cookieFormat.format(now));
}
}
if (cookie.getDomain() != null) {
header.append(";Domain=" + cookie.getDomain());
}
if (cookie.getPath() != null) {
header.append(";Path=" + cookie.getPath());
}
if (cookie.getSecure()) {
header.append(";Secure");
}
header.append(";httpOnly");
addHeader("Set-Cookie", header.toString());
}
}
Filtrar
Este filtro ajusta las respuestas configuradas en el contenedor anterior.
package yourpackage;
@WebFilter(filterName = "HttpOnlyFilter", urlPatterns = {"/*"})
public class HttpOnlyFilter implements Filter {
private FilterConfig config;
@Override
public void destroy() {
this.config = null;
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpOnlyResponseWrapper hres = new HttpOnlyResponseWrapper((HttpServletResponse)res);
chain.doFilter(req, hres);
}
public FilterConfig getFilterConfig() {
return this.config;
}
@Override
public void init(FilterConfig config) throws ServletException {
this.config = config;
}
}
Adaptado (ADVERTENCIA: ¡NO una copia exacta!) De la fuente: http://sylvanvonstuppe.blogspot.com/2007/07/servlet-filter-for-httponly.html
web.xml
Un último detalle: SÓLO SI tiene la exploración de anotación desactivada en su sistema de esta manera:
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
version="2.5" ***metadata-complete="true"***>
</web-app>
Luego deberá configurar manualmente el filtro anterior en su archivo web.xml, así:
<filter>
<filter-name>HttpOnlyFilter
<filter-class>yourpackage.HttpOnlyFilter
</filter>
<filter-mapping>
<filter-name>HttpOnlyFilter
<url-pattern>/*
</filter-mapping>
Si su aplicación escanea anotaciones (que es la predeterminada), la parte web.xml no es necesaria.
Odio la configuración XML, así que dedico algo de tiempo a encontrar una solución que no sea XML.
Desde Spring Security 1.3 puedes usar
server.session.cookie.http-only=true
server.session.cookie.secure=true
en su archivo application.properties .
Tal vez haya una forma de configurar esto usando la Configuración Java pura, pero no puedo encontrarlos.