Подтвердить что ты не робот

Как настроить cookie HttpOnly в tomcat/java webapps?

Прочитав сообщение в блоге Jeff на Защита ваших файлов cookie: HttpOnly. Я хотел бы реализовать файлы cookie HttpOnly в своем веб-приложении.

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

4b9b3361

Ответ 1

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

См. запись changelog для ошибки 44382.

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

Функцию httpOnly можно включить для всех веб-приложений в conf/context.xml:

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

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

Ответ 2

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

При настройке файлов cookie в приложении используйте

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

Однако во многих веб-папках самым важным cookie является идентификатор сеанса, который автоматически устанавливается контейнером в качестве файла cookie 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" );
} 

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

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

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

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

Ответ 3

Пожалуйста, будьте осторожны, чтобы не перезаписывать флаг "secure" cookie в 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);
    }
}

Ответ 4

Для файлов сеансов cookie он пока не поддерживается в Tomcat. См. Отчет об ошибке Необходимо добавить поддержку HTTPOnly параметра cookie сеанса. В настоящее время существует несколько проблем, связанных с работой, здесь здесь, что в основном сводится к ручному исправлению 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);
}

Ответ 5

Если ваш веб-сервер поддерживает спецификацию Serlvet 3.0, например tomcat 7. 0+, вы можете использовать ниже в web.xml как:

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

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

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

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

Пожалуйста, посмотрите, как установить httponly и cookie сеанса для веб-приложения java

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

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

Ответ 9

Я нашел в OWASP

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