Как настроить файлы cookie HttpOnly в веб-приложениях tomcat / java? - PullRequest
71 голосов
/ 29 августа 2008

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

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

Ответы [ 9 ]

61 голосов
/ 06 июля 2009

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 (в том же как указано выше).

19 голосов
/ 29 августа 2008

Обновление: материал JSESSIONID здесь только для старых контейнеров. Пожалуйста, используйте JT в настоящее время принимает ответ, если вы используете

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

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

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

Если вы используете только этот файл cookie, вы можете написать ServletFilter, чтобы переустанавливать файлы cookie при выходе, заставляя 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 JSESSIONID, вам необходимо расширить этот код, чтобы установить все файлы cookie в фильтре. Это не очень хорошее решение в случае использования нескольких файлов cookie, но, возможно, это приемлемое быстрое исправление для установки только JSESSIONID.

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

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

14 голосов
/ 23 сентября 2009

Пожалуйста, будьте осторожны, чтобы не перезаписать флаг «; secure» cookie в https-сессиях. Этот флаг запрещает браузеру отправлять cookie-файлы по незашифрованному 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);
    }
}
9 голосов
/ 29 августа 2008

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

Чтобы подвести итог обходного пути, необходимо загрузить источник * 5,5 5,5 *1007*, а затем изменить источник в следующих местах:

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);
}
8 голосов
/ 23 июня 2015

Если ваш веб-сервер поддерживает спецификацию 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

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

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

2 голосов
/ 30 января 2013

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

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

2 голосов
/ 19 августа 2010

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

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

1 голос
/ 08 декабря 2015

В Tomcat6 вы можете условно включить из класса прослушивателя HTTP:

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();
        }
    }
}
0 голосов
/ 06 декабря 2018

Я нашел в OWASP

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

это также исправлено для проблемы безопасности "httponlycookies in config"

...