Frage

Nachdem ich Jeffs Blog-Beitrag gelesen habe Schutz Ihrer Cookies:HttpOnly.Ich möchte HttpOnly-Cookies in meiner Webanwendung implementieren.

Wie weisen Sie Tomcat an, für Sitzungen nur HTTP-Cookies zu verwenden?

War es hilfreich?

Lösung

httpOnly wird ab Tomcat 6.0.19 und Tomcat 5.5.28 unterstützt.

Siehe die Änderungsprotokoll Eintrag für Fehler 44382.

Der letzte Kommentar zum Fehler 44382 Staaten: "Dies wurde auf 5.5.x angewendet und wird ab 5.5.28 enthalten." Es scheint jedoch nicht, dass 5.5.28 veröffentlicht wurde.

Die httpOnly-Funktionalität kann für alle Webapps in aktiviert werden conf/context.xml:

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

Meine Interpretation ist, dass es auch für einen individuellen Kontext funktioniert, indem es auf den gewünschten Wert eingestellt wird Kontext Eintrag in conf/server.xml (auf die gleiche Weise wie oben).

Andere Tipps

Aktualisieren:Das Jsession -Zeug hier ist nur für ältere Behälter.Bitte verwenden Sie die derzeit akzeptierte Antwort von JT, es sei denn, Sie verwenden <tomcat 6.0.19 oder <tomcat 5.5.28 oder einen anderen Container, der Httponly JSESSIONID -Cookies als Konfigurationsoption nicht unterstützt.

Verwenden Sie beim Setzen von Cookies in Ihrer App

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

In vielen Webanwendungen ist das wichtigste Cookie jedoch die Sitzungskennung, die vom Container automatisch als JSESSIONID-Cookie gesetzt wird.

Wenn Sie nur dieses Cookie verwenden, können Sie einen ServletFilter schreiben, um die Cookies beim Verlassen zurückzusetzen und JSESSIONID auf HttpOnly zu setzen.Die Seite unter http://keepitlocked.net/archive/2007/11/05/java-and-httponly.aspx http://alexsmolen.com/blog/?p=16 schlägt vor, Folgendes in einen Filter einzufügen.

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

Beachten Sie jedoch, dass dadurch alle Cookies überschrieben werden und nur das gesetzt wird, was Sie hier in diesem Filter angeben.

Wenn Sie zusätzliche Cookies zum JSESSIONID-Cookie verwenden, müssen Sie diesen Code erweitern, um alle Cookies im Filter festzulegen.Dies ist im Falle mehrerer Cookies keine gute Lösung, aber möglicherweise eine akzeptable Schnelllösung für die reine JSESSIONID-Einrichtung.

Bitte beachten Sie, dass bei der Weiterentwicklung Ihres Codes im Laufe der Zeit ein böser versteckter Fehler auf Sie wartet, wenn Sie diesen Filter vergessen und versuchen, an einer anderen Stelle in Ihrem Code ein weiteres Cookie zu setzen.Natürlich wird es nicht eingestellt.

Das ist allerdings wirklich ein Hack.Wenn Sie Tomcat verwenden und es kompilieren können, werfen Sie einen Blick auf den hervorragenden Vorschlag von Shabaz, die HttpOnly-Unterstützung in Tomcat zu patchen.

Bitte achten Sie darauf, das „;secure“-Cookie-Flag in https-Sitzungen nicht zu überschreiben.Dieses Flag verhindert, dass der Browser das Cookie über eine unverschlüsselte HTTP-Verbindung sendet, wodurch die Verwendung von https für legitime Anfragen grundsätzlich sinnlos wird.

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

Für Sitzungscookies scheint es in Tomcat noch nicht unterstützt zu werden.Siehe Fehlerbericht Es muss Unterstützung für den HTTPOnly-Sitzungs-Cookie-Parameter hinzugefügt werden.Für den Moment gibt es eine etwas komplizierte Problemumgehung Hier, was im Wesentlichen darauf hinausläuft, Tomcat manuell zu patchen.Ich fürchte, ich kann derzeit keinen einfachen Weg finden, dies zu tun.

Um die Problemumgehung zusammenzufassen: Dazu gehört das Herunterladen von Version 5.5 Quelle, und ändern Sie dann die Quelle an den folgenden Stellen:

org.apache.catalina.connector.Request.java

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

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

org.apache.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);
}

Wenn Ihr Webserver die Serlvet 3.0-Spezifikation unterstützt, z. B. Tomcat 7.0+, können Sie die folgenden Informationen verwenden web.xml als:

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

Wie in den Dokumenten erwähnt:

HttpOnly:Gibt an, ob eine von dieser Webanwendung erstellte Sitzungsverfolgung von Cookies als httponly gekennzeichnet wird

Sicher:Gibt an, ob eine von dieser Webanwendung erstellte Sitzungsverfolgung von Cookies als sicher bezeichnet wird, auch wenn die Anforderung, die die entsprechende Sitzung initiiert hat

Bitte beziehen Sie sich auf So legen Sie httponly und Sitzungscookies für Java-Webanwendungen fest

Außerdem ist zu beachten, dass durch die Aktivierung von HttpOnly Applets unterbrochen werden, die einen zustandsbehafteten Zugriff auf die JVM erfordern.

Die Applet-HTTP-Anfragen verwenden nicht das jsessionid-Cookie und werden möglicherweise einem anderen Tomcat zugewiesen.

Bei Cookies, die ich explizit setze, habe ich auf Nutzung umgestellt SimpleCookie zur Verfügung gestellt von Apache Shiro.Es erbt nicht von javax.servlet.http.Cookie, sodass etwas mehr Jonglieren erforderlich ist, damit alles ordnungsgemäß funktioniert. Es stellt jedoch einen Eigenschaftssatz „HttpOnly“ bereit und funktioniert mit Servlet 2.5.

Um ein Cookie für eine Antwort zu setzen, anstatt es zu tun response.addCookie(cookie) Du musst es tun cookie.saveTo(request, response).

In Tomcat6 können Sie über Ihre HTTP-Listener-Klasse Folgendes bedingt aktivieren:

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

Verwendung dieser Klasse

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

Ich habe es gefunden OWASP

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

Dies ist auch eine Lösung für das Sicherheitsproblem „httponlycookies in config“.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top