Jak skonfigurować pliki cookie HttpOnly w aplikacji tomcat / java webapps?

Po przeczytaniu wpisu Jeffa na blogu Ochrona Twoich plików cookie: HttpOnly. Chciałbym zaimplementować pliki cookie HttpOnly w mojej aplikacji internetowej.

Jak powiedzieć tomcat używać http tylko pliki cookie dla sesji?

Author: Cheekysoft, 2008-08-29

8 answers

HttpOnly jest obsługiwany od wersji Tomcat 6.0.19 i Tomcat 5.5.28.

Zobacz wpis changelog dla błędu 44382.

Ostatni komentarz do Buga 44382 Stany, " to zostało zastosowane do 5.5.x i zostaną uwzględnione w wersji 5.5.28."Jednak nie wydaje się, aby 5.5.28 został wydany.

Funkcjonalność httpOnly może być włączona dla wszystkich webapps w conf / context.xml :

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

Moja interpretacja jest taka, że działa również dla jednostki kontekstu poprzez ustawienie go na pożądanym kontekst wpis w conf / server.xml (w taki sam sposób jak powyżej).

 61
Author: jt.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-07-06 16:46:12

Update: rzeczy JSESSIONID tutaj jest tylko dla starszych pojemników. Proszę użyć aktualnie zaakceptowana odpowiedź jt, chyba że używasz

Podczas ustawiania plików cookie w aplikacji, użyj

response.setHeader( "Set-Cookie", "name=value; HttpOnly");

Jednak w wielu webapps najważniejszym ciasteczkiem jest identyfikator sesji, który jest automatycznie ustawiany przez kontener jako Jsessionid cookie.

Jeśli używasz tylko tego pliku cookie, możesz napisać ServletFilter, aby ponownie ustawić pliki cookie po wyjściu, zmuszając JSESSIONID do HttpOnly. Strona w http://keepitlocked.net/archive/2007/11/05/java-and-httponly.aspx http://alexsmolen.com/blog/?p=16 sugeruje dodanie następujących elementów w filtrze.

if (response.containsHeader( "SET-COOKIE" )) {
  String sessionid = request.getSession().getId();
  response.setHeader( "SET-COOKIE", "JSESSIONID=" + sessionid 
                      + ";Path=/<whatever>; Secure; HttpOnly" );
} 

Ale zauważ, że to nadpisze wszystkie pliki cookie i ustawi tylko to, co tutaj podasz w tym filtrze.

Jeśli używasz dodatkowych pliki cookie do pliku cookie JSESSIONID, następnie musisz rozszerzyć ten kod, aby ustawić wszystkie pliki cookie w filtrze. Nie jest to dobre rozwiązanie w przypadku wielu plików cookie, ale jest to prawdopodobnie akceptowalna szybka poprawka dla konfiguracji tylko JSESSIONID.

Pamiętaj, że gdy twój kod ewoluuje w czasie, czeka na ciebie paskudny Ukryty błąd, gdy zapomnisz o tym filtrze i spróbujesz ustawić inne ciasteczko w innym miejscu w kodzie. Oczywiście, że nie.

To naprawdę jest ale hack. Jeśli używasz Tomcat i możesz go skompilować, spójrz na doskonałą sugestię Shabaza, aby łatać wsparcie HttpOnly do Tomcat.
 19
Author: Cheekysoft,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-11 08:57:47

Należy uważać, aby nie nadpisać flagi ";secure" cookie w https-sessions. Ta flaga uniemożliwia przeglądarce wysyłanie pliku cookie przez niezaszyfrowane połączenie http, co zasadniczo czyni korzystanie z https dla legalnych żądań bezcelowymi.

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);
    }
}
 14
Author: Hendrik Brummermann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-22 23:02:46

W przypadku plików cookie sesji nie wydaje się jeszcze obsługiwany w Tomcat. Zobacz Raport o błędzie potrzeba dodania obsługi parametru HttpOnly session cookie . Nieco zaangażowane obejście na razie można znaleźć TUTAJ , co w zasadzie sprowadza się do ręcznego łatania Tomcata. Nie mogę znaleźć łatwego sposobu, aby to zrobić w tym momencie, w tym momencie obawiam się.

Podsumowując obejście, polega na pobraniu źródła 5.5 , a następnie zmianie źródła w następujące miejsca:

org.Apacz.catalina.łącznik.Prośba.java

//this is what needs to be changed
//response.addCookieInternal(cookie);

//this is whats new
response.addCookieInternal(cookie, true);
}

org.Apacz.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);
}
 9
Author: Shabaz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-28 21:36:07

Jeśli twój serwer WWW obsługuje specyfikację Serlvet 3.0, taką jak tomcat 7.0+, możesz użyć poniżej w web.xml jako:

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

Jak wspomniano w dokumentach:

HttpOnly : określa, czy pliki cookie śledzenia sesji utworzone przez ta aplikacja internetowa będzie oznaczona jako HttpOnly

Secure : Określa czy pliki cookie śledzenia sesji utworzone przez tę aplikację internetową zostaną Oznaczone jako Bezpieczne, nawet jeśli żądanie, które zainicjowało odpowiednia sesja to używanie zwykłego HTTP zamiast HTTPS

Jak ustawić httponly i session cookie dla aplikacji webowej java
 7
Author: Alireza Fattahi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-20 04:02:23

Należy również zauważyć, że włączenie HttpOnly spowoduje złamanie apletów, które wymagają dostępu stanowego z powrotem do jvm.

Żądania HTTP apletu nie będą używać pliku cookie jsessionid i mogą zostać przypisane do innego programu tomcat.

 2
Author: Pete Brumm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 20:33:57

W przypadku plików cookie, które wyraźnie ustawiam, przełączyłem się na użycie SimpleCookie dostarczone przez Apache Shiro . Nie dziedziczy po javaxie.servlet.http.Cookie, więc potrzeba trochę więcej żonglowania, aby wszystko działało poprawnie, jednak zapewnia on właściwość ustawioną HttpOnly i działa z Servletem 2.5.

Aby ustawić plik cookie w odpowiedzi, zamiast robić response.addCookie(cookie), musisz zrobić cookie.saveTo(request, response).

 2
Author: Jesse Vogt,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-30 17:49:40

W Tomcat6 możesz warunkowo włączyć z klasy słuchacza HTTP:

public void contextInitialized(ServletContextEvent event) {                 
   if (Boolean.getBoolean("HTTP_ONLY_SESSION")) HttpOnlyConfig.enable(event);
}

Użycie tej klasy

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();
        }
    }
}
 0
Author: Systemsplanet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-08 03:21:21