cookies टॉमकैट 7 सत्रीय कुकी केवल http-अक्षम और सुरक्षित अक्षम करती है




tomcat7 session-cookies (3)

अपाचे के ऊपर जॉर्ज पॉवेल के समाधान के अलावा, यदि आप आईआईएस पर हैं, तो आप इसे निम्नानुसार हल कर सकते हैं:

  1. आईआईएस यूआरएल रिवाइट मॉड्यूल स्थापित करें
  2. अपने web.config में निम्नलिखित जोड़ें

<rewrite>
  <outboundRules>
    <rule name="RemoveSecureJessionID">
      <match serverVariable="RESPONSE_Set-Cookie" pattern="^(.*JSESSIONID.*)Secure;(.*)$" />
      <action type="Rewrite" value="{R:1}{R:2}" />
    </rule>
  </outboundRules>
</rewrite>

यह समाधान पीट फ्रीटाग के ब्लॉग से था

जैसा ऊपर बताया गया है, हाल ही में क्रोम अपडेट (जनवरी 2017) के बाद से, यह एक मुद्दा बन गया है।

मेरे पास एक वेब एप्लिकेशन है जो टॉमकैट 7 सर्वर पर चल रहा है। सत्र आईडी के साथ कुकी डिफ़ॉल्ट रूप से HttpOnly Secure और Secure । मैं JSESSIONID कुकी के लिए इस झंडे को अक्षम करना चाहता हूं। लेकिन यह काम नहीं करेगा। मैंने इसे अपनी web.xml फ़ाइल में बदल दिया है लेकिन यह काम नहीं कर रहा है।

<session-config>
    <session-timeout>20160</session-timeout>
    <cookie-config>
        <http-only>false</http-only>
        <secure>false</secure>
    </cookie-config>
</session-config>

मुझे पता है कि यह एक सुरक्षा जोखिम है क्योंकि एक हमलावर कुकी चुरा सकता है और सत्र को हाइजैक कर सकता है अगर उसे xss vuln मिल गया है।

JSESSIONID कुकी को HTTP और HTTPS और AJAX अनुरोधों के साथ भेजना चाहिए।

संपादित करें:

मैंने conf/context.xml फ़ाइल में निम्न विकल्प जोड़कर सफलतापूर्वक ध्वज को अक्षम कर HttpOnly :

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

यदि आप टोमकैट से कोड पढ़ते हैं तो आपको मिलेगा:

// Always set secure if the request is secure
if (scc.isSecure() || secure) {
    cookie.setSecure(true);
}

तो sessionCookieConfig.setSecure(false); साथ sessionCookieConfig.setSecure(false); कुकी पर सुरक्षित ध्वज को निष्क्रिय करने का प्रयास कर रहा है sessionCookieConfig.setSecure(false); एक श्रोता या <cookie-config><secure>false</secure></cookie-config> में web.xml काम नहीं करेगा क्योंकि अनुरोध सुरक्षित है (यानी अनुरोध से सुरक्षित है) https यूआरएल या एसएसएल पोर्ट)।

सत्र समाधान के तुरंत बाद सर्वर प्रतिक्रिया पर JSESSIONID कुकी को संशोधित करने के लिए अनुरोध फ़िल्टर का उपयोग करना एक समाधान है। यह मेरा कार्यान्वयन है (बहुत बुनियादी):

public class DisableSecureCookieFilter implements javax.servlet.Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        if(request instanceof HttpServletRequest && response instanceof HttpServletResponse) {
            request = new ForceUnsecureSessionCookieRequestWrapper((HttpServletRequest) request, (HttpServletResponse) response);
        }

        chain.doFilter(request, response);
    }

    @Override
    public void destroy() { }

    public static class ForceUnsecureSessionCookieRequestWrapper extends HttpServletRequestWrapper {
        HttpServletResponse response;

        public ForceUnsecureSessionCookieRequestWrapper(HttpServletRequest request, HttpServletResponse response) {
            super(request);
            this.response = response;
        }

        @Override
        public HttpSession getSession(boolean create) {
            if(create) {
                HttpSession session = super.getSession(create);
                updateCookie(response.getHeaders("Set-Cookie"));
                return session;
            }
            return super.getSession(create);
        }

        @Override
        public HttpSession getSession() {
            HttpSession session = super.getSession();
            if(session != null) {
                updateCookie(response.getHeaders("Set-Cookie"));
            }

            return session;
        }

        protected void updateCookie(Collection<String> cookiesAfterCreateSession) {
            if(cookiesAfterCreateSession != null && !response.isCommitted()) {
                // search if a cookie JSESSIONID Secure exists
                Optional<String> cookieJSessionId = cookiesAfterCreateSession.stream()
                                                        .filter(cookie -> cookie.startsWith("JSESSIONID") && cookie.contains("Secure"))
                                                        .findAny();
                if(cookieJSessionId.isPresent()) {
                    // remove all Set-Cookie and add the unsecure version of the JSessionId Cookie
                    response.setHeader("Set-Cookie", cookieJSessionId.get().replace("Secure", ""));

                    // re-add all other Cookies
                    cookiesAfterCreateSession.stream()
                            .filter(cookie -> !cookie.startsWith("JSESSIONID"))
                            .forEach(cookie -> response.addHeader("Set-Cookie", cookie));
                }
            }
        }
    }

}

और web.xml में:

<filter>
    <filter-name>disableSecureCookieFilter</filter-name>
    <filter-class>com.xxxx.security.DisableSecureCookieFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>disableSecureCookieFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

याद रखें कि असुरक्षित कुकीज़ को सक्षम करना एक महत्वपूर्ण https सुरक्षा को बाईपास करता है! (मुझे http से https तक एक चिकनी संक्रमण के लिए ऐसा करना था)


मुझे टॉमकैट में इसका कोई समाधान नहीं मिला, लेकिन यदि आप रिवर्स प्रॉक्सी के रूप में अपाचे का उपयोग कर रहे हैं तो आप कर सकते हैं:

Header edit* Set-Cookie "(JSESSIONID=.*)(; Secure)" "$1"

mod_headers साथ जो सुरक्षित ध्वज को हटाने के लिए शीर्ष पर हेडर को mod_headers कर देगा। सुंदर नहीं है लेकिन यह महत्वपूर्ण है अगर काम करता है।





cookie-httponly