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

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

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

71 голос | спросил ScArcher2 29 AM00000010000003031 2008, 01:09:30

9 ответов


0

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>

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

ответил jt. 6 J000000Monday09 2009, 20:46:12
0
  

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

При настройке файлов 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.

ответил Cheekysoft 29 AM00000010000003631 2008, 01:37:36
0

Пожалуйста, будьте осторожны, чтобы не перезаписать флаг cookie "; secure" в 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);
    }
}
ответил Hendrik Brummermann 23 rdEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 23 Sep 2009 14:04:59 +0400 2009, 14:04:59
0

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

Подводя итог, можно скачать источник , а затем измените источник в следующих местах:

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);
}
ответил Shabaz 29 AM00000010000000731 2008, 01:36:07
0

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

ответил Alireza Fattahi 23 J0000006Europe/Moscow 2015, 10:04:45
0

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

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

ответил Pete Brumm 19 AM000000120000005731 2010, 00:33:57
0

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

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

ответил Jesse Vogt 30 Jpm1000000pmWed, 30 Jan 2013 21:49:40 +040013 2013, 21:49:40
0

В 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();
        }
    }
}
ответил Systemsplanet 8 TueEurope/Moscow2015-12-08T06:21:21+03:00Europe/Moscow12bEurope/MoscowTue, 08 Dec 2015 06:21:21 +0300 2015, 06:21:21
0

Я нашел в OWASP

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

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

ответил Ravipati Praveen 6 ThuEurope/Moscow2018-12-06T16:00:02+03:00Europe/Moscow12bEurope/MoscowThu, 06 Dec 2018 16:00:02 +0300 2018, 16:00:02

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132