http

2013-02-20 63 views
21

पर सुरक्षित JSESSIONID कुकी का उपयोग करने के लिए टोमकैट को मजबूर करना क्या सभी मौकों पर एक सुरक्षित ध्वज के साथ JSESSIONID कुकी बनाने के लिए टॉमकैट 7 को कॉन्फ़िगर करने का कोई तरीका है?http

सुरक्षित कॉन्फ़्रेंस के साथ टॉमकैट फ़्लैगिंग सत्र कुकी में सामान्य कॉन्फ़िगरेशन परिणाम केवल तभी सुरक्षित होते हैं जब कनेक्शन https के माध्यम से किया जाता है। हालांकि, मेरे उत्पादन परिदृश्य में, टोमकैट एक रिवर्स प्रॉक्सी/लोड बैलेंसर के पीछे है जो https कनेक्शन और http पर संपर्क टोमकैट को संभालता है (और समाप्त करता है)।

क्या मैं किसी भी तरह टॉमकैट के साथ सत्र कुकी पर सुरक्षित ध्वज को मजबूर कर सकता हूं, भले ही कनेक्शन सादे http के माध्यम से किया गया हो?

उत्तर

29

अंत में, मेरी प्रारंभिक परीक्षण के विपरीत, web.xml समाधान मेरे लिए बिलाव 7. पर काम किया

जैसे मैंने इस स्निपेट को web.xml में जोड़ा और यह सादे HTTP पर रिवर्स प्रॉक्सी संपर्क टोमकैट के बावजूद सत्र कुकी को सुरक्षित के रूप में चिह्नित करता है।

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

ServletContext.getSessionCookieConfig()। SetSecure (सही)

+1

में बताया गया है के बाद से सर्वलेट 3 http://docs.oracle.com/javaee/6/api/javax/servlet/SessionCookieConfig.html –

1

एक और दृष्टिकोण, मार्क्स के समान है, SessionCookieConfig उपयोग करने के लिए होगा, लेकिन JNDI विन्यास से एक संदर्भ श्रोता में सेट:

कोड:

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

web.xml अंदर :

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

अपने context.xml में:

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

यह आपको तैनाती पर्यावरण में क्रम बिल्कुल सत्र कुकी विन्यास निर्धारित करने की अनुमति देता है। इस प्रकार, आप स्थानीय रूप से विकास करने के लिए उसी वेबपैप (युद्ध फ़ाइल) का उपयोग कर सकते हैं (जहां आपके पास https नहीं होगा) और उत्पादन में जहां आप ALWAYS https चाहते हैं।

ध्यान दें, इस दृष्टिकोण OWASP documentation