2013-02-20 23 views
21
üzerinden kullanmak üzere zorlamak

Tomcat 7'yi tüm durumlarda güvenli bir bayrakla JSESSIONID çerezi oluşturmak için yapılandırmanın bir yolu var mı?Tomcat'i güvenli JSESSIONID çerezini http

Her zamanki yapılandırma Tomcat işaret oturum çerezini, güvenli bağlantı ile yalnızca https yoluyla bağlantı kurulduğunda verir. Ancak benim üretim senaryomda Tomcat, https bağlantısını yürüten (ve sonlandıran) bir ters proxy/yük dengeleyicinin arkasında ve http üzerinden tomcat ile bağlantı kurar.

Bağlantı, düz http ile yapılsa da, Tomcat ile oturum çerezinde güvenli bayrağı zorlayabilir miyim?

cevap

29

(doğru) setSecure, benim ilk testlerden aksine, web.xml çözüm Tomcat 7. benim için çalıştı(). ServletContext.getSessionCookieConfig

Ör Bu snippet'i web.xml'ye ekledim ve ters proxy'nin düz HTTP üzerinden tomcat ile iletişim kurmasına rağmen oturum çerezini güvenli olarak işaretler.

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

Sonunda

+1

açıklanan –

1

Mark'ın benzer başka bir yaklaşım, SessionCookieConfig kullanmak olabilir ama Jndi yapılandırmasından bir bağlam dinleyici bunu belirleyecek:

kodu: web.xml''deki İçinde

import javax.naming.Context; 
import javax.naming.InitialContext; 
import javax.naming.NamingException; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 
import javax.servlet.SessionCookieConfig; 


import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 


public class JndiSessionCookieConfigListener implements ServletContextListener { 
    private static final Logger logger = LoggerFactory.getLogger(JndiSessionCookieConfigListener.class); 

    private volatile Context jndiSessionCookieConfig; 
    private volatile SessionCookieConfig sessionCookieConfig; 

    @Override 
    public void contextInitialized(ServletContextEvent sce) { 
     String listenerName = getClass().getSimpleName(); 
     try { 
      logger.info("JNDI override session cookie config found for {}", listenerName); 
      jndiSessionCookieConfig = (Context) new InitialContext().lookup(
        "java:comp/env/" + listenerName); 
     } 
     catch (NamingException e) { 
      logger.info("No JNDI override session cookie config found for {}", listenerName); 
     } 

     sessionCookieConfig = sce.getServletContext().getSessionCookieConfig(); 

     String comment = getString("comment"); 
     if (comment != null) { 
      logger.debug("\t[comment]: [{}]", comment); 
      sessionCookieConfig.setComment(comment); 
     } 

     String domain = getString("domain"); 
     if (domain != null) { 
      logger.debug("\t[domain]: [{}]", domain); 
      sessionCookieConfig.setDomain(domain); 
     } 

     Boolean httpOnly = getBoolean("http-only"); 
     if (httpOnly == null) { 
      sessionCookieConfig.setHttpOnly(true); 
     } 
     else { 
      logger.debug("\t[http-only]: [{}]", httpOnly); 
      sessionCookieConfig.setHttpOnly(httpOnly); 
     } 

     Integer maxAge = getInteger("max-age"); 
     if (maxAge != null) { 
      sessionCookieConfig.setMaxAge(maxAge); 
     } 

     String name = getString("name"); 
     if (name != null) { 
      logger.debug("\t[name]: [{}]", name); 
      sessionCookieConfig.setName(name); 
     } 

     String path = getString("path"); 
     if (path != null) { 
      logger.debug("\t[path]: [{}]", path); 
      sessionCookieConfig.setPath(path); 
     } 

     Boolean secure = getBoolean("secure"); 
     if (secure == null) { 
      sessionCookieConfig.setSecure(true); 
     } 
     else { 
      logger.debug("\t[secure]: [{}]", secure); 
      sessionCookieConfig.setSecure(secure); 
     } 
    } 

    @Override 
    public void contextDestroyed(ServletContextEvent sce) { 
    } 

    private Boolean getBoolean(String name) { 
     Object value; 
     try { 
      value = jndiSessionCookieConfig.lookup(name); 
      if (value instanceof Boolean) { 
       return (Boolean)value; 
      } 
      else { 
       return Boolean.valueOf(value.toString()); 
      } 
     } 
     catch (NamingException e) { 
      return null; 
     } 
    } 

    private Integer getInteger(String name) { 
     Object value; 
     try { 
      value = jndiSessionCookieConfig.lookup(name); 
      if (value instanceof Integer) { 
       return (Integer)value; 
      } 
      else { 
       return Integer.valueOf(value.toString()); 
      } 
     } 
     catch (NamingException e) { 
      return null; 
     } 
    } 

    private String getString(String name) { 
     Object value; 
     try { 
      value = jndiSessionCookieConfig.lookup(name); 
      return value.toString(); 
     } 
     catch (NamingException e) { 
      return null; 
     } 
    } 
} 

: En context.xml olarak

... 
    <listener> 
    <listener-class> 
     org.mitre.caasd.servlet.init.JndiSessionCookieConfigListener 
    </listener-class> 
    </listener> 
... 

:

... 
<Environment name="JndiSessionCookieConfigListener/secure" 
    type="java.lang.String" 
    override="false" 
    value="true" /> 
... 

Bu dağıtım ortamında yılında zamanında tüm oturum tanımlama yapılandırmaları ayarlamanızı sağlar. Böylece, yerel olarak (https yok olurdu) geliştirme yapmak için aynı webapp (savaş dosyası) kullanabilirsiniz ve üretim ALWAYS https istiyorum.

Not, bu yaklaşım, sunucu uygulaması 3 http://docs.oracle.com/javaee/6/api/javax/servlet/SessionCookieConfig.html yana OWASP documentation

İlgili konular