Как настроить HttpOnly куки в Tomcat / Java WebApps?

голоса
71

После прочтения блога Джеффа по защите куки: HttpOnly . Я хотел бы реализовать HTTPOnly печенье в моем веб - приложение.

Как вы говорите, кот использовать HTTP только куки для сессий?

Задан 28/08/2008 в 22:09
источник пользователем
На других языках...                            


8 ответов

голоса
60

HttpOnly поддерживается от Tomcat 6.0.19 и Tomcat 5.5.28.

Смотрите журнал изменений запись об ошибке 44382.

Последний комментарий для ошибок 44382 состояний, «это было применено к 5.5.x и будет включен в 5.5.28 и далее.» Однако, это не кажется , что 5.5.28 был освобожден.

Функциональность HTTPOnly может быть включена для всех WebApps в конф / context.xml :

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

Моя интерпретация является то , что он также работает для отдельного контекста, установив его на желаемом Context запись в конф / server.xml (таким же образом , как описано выше).

Ответил 06/07/2009 в 17:46
источник пользователем

голоса
19

Обновление: JSESSIONID материал здесь только для старых контейнеров. Пожалуйста, используйте принятый в настоящее время ответа JT, если только вы не используете <Tomcat 6.0.19 или <Tomcat 5.5.28 или другой контейнер, который не поддерживает HttpOnly JSessionID печенья в качестве опции конфигурации.

При установке куки в вашем приложении, используйте

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

Тем не менее, во многих WebApps, наиболее важным является печенье идентификатор сеанса, который автоматически устанавливается в контейнер, как печенье JSESSIONID.

Если вы используете только этот печенье, вы можете написать ServletFilter повторно установить кук на выходе, заставляя JSESSIONID к HttpOnly. Страница в http://keepitlocked.net/archive/2007/11/05/java-and-httponly.aspx http://alexsmolen.com/blog/?p=16 предлагает добавить следующее в фильтре.

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

но учтите, что это приведет к перезаписи все куки и установить только то, что вы заявляете здесь, в этом фильтре.

Если вы используете дополнительные куки для печенья JSESSIONID, то вам нужно расширить этот код, чтобы установить все куки в фильтре. Это не большое решение, в случае множественного печенья, но это, возможно, является приемлемым быстро исправить для JSESSIONID только для установки.

Пожалуйста, обратите внимание, что ваш код изменяется с течением времени, есть противная скрытая ошибка ждет вас, когда вы забываете об этом фильтре и попытаться установить другие печенье где-нибудь еще в вашем коде. Конечно, он не будет установлен.

Это действительно хак, хотя. Если вы используете Tomcat и может скомпилировать его, а затем взгляните на отличное предложение Шабаз, чтобы залатать HttpOnly поддержку в Tomcat.

Ответил 28/08/2008 в 22:37
источник пользователем

голоса
14

Пожалуйста, будьте осторожны, чтобы не перезаписать, флаг печенья в HTTPS-сессий «безопасный». Этот флаг предотвращает браузер отправлять кук через незашифрованное соединение HTTP, в основном делают использование протокола HTTPS для запросов законных бессмысленных.

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);
    }
}
Ответил 23/09/2009 в 11:04
источник пользователем

голоса
9

Для сессионных куков это , кажется, не будет поддерживаться в Tomcat еще. Смотрите отчет об ошибке , нужно добавить поддержку HTTPOnly сессии параметра печеньем . Несколько вовлечены работы вокруг теперь можно найти здесь , которая в основном сводится к тому, вручную заплат Tomcat. Не могу найти простой способ сделать это в данный момент в данный момент я напуган.

Подводя итоги работы вокруг, она включает в себя загрузку 5.5 источника , а затем измените источник в следующих местах:

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);
}
Ответил 28/08/2008 в 22:36
источник пользователем

голоса
6

Если Serlvet 3,0 веб - сервер, как коту 7.0+, вы можете использовать ниже web.xmlкак:

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

Как уже упоминалось в документации:

HttpOnly : Определяет , будет ли отмечен любой сеанс отслеживания куки , созданное этим веб - приложение , как HttpOnly

Secure : Определяет , будет ли быть помечен как безопасный , даже если запрос , который инициировал соответствующий сеанс используется простой HTTP вместо HTTPS любой сеанс отслеживания куки , созданные этим веб - приложения

Пожалуйста , обратитесь к как установить HTTPOnly и куки сессии для Java Web appliaction

Ответил 23/06/2015 в 07:04
источник пользователем

голоса
2

Для печенья , что я явно устанавливающим, я переключил использовать SimpleCookie предоставленного Apache Shiro . Она не наследуется от javax.servlet.http.Cookie поэтому она занимает немного больше жонглирование , чтобы все работало правильно , однако он предоставляет свойство набора HttpOnly и он работает с Servlet 2.5.

Для установки куки на ответ, а не делать что response.addCookie(cookie)вам нужно сделать cookie.saveTo(request, response).

Ответил 30/01/2013 в 18:49
источник пользователем

голоса
2

Также следует отметить, что включение HttpOnly сломается апплеты, которые требуют доступа с отслеживанием состояния обратно в JVM.

запросы апплета HTTP не будут использовать JSessionID печенья и могут получить назначены другой кот.

Ответил 18/08/2010 в 21:33
источник пользователем

голоса
0

В Tomcat6, можно условно включить с вашего HTTP Listener класса:

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

Используя этот класс

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();
        }
    }
}
Ответил 08/12/2015 в 03:21
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more