2008-08-28 3 views

ответ

59

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

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

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

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

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

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

9

Для файлов сеансов cookie он пока не поддерживается в Tomcat. См. Отчет об ошибке Need to add support for HTTPOnly session cookie parameter. В настоящее время существует несколько проблем, связанных с работой: here, что в основном сводится к ручному исправлению Tomcat. В настоящий момент я не могу найти простой способ сделать это, я боюсь.

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

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

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

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

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

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

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

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

+8

Этот код удаляет флаг Secure, тем самым делая использование https бессмысленным. – 2010-06-23 15:02:29

+0

В Servlet серверах приложений 3.0 жалоб я могу установить HttpOnly и безопасные флаги для куки сессии (JSESSIONID), добавив следующее в web.xml: <сеанс-конфигурации> <куки-конфигурации> правда true 2014-09-25 09:21:47

+0

@RogerJin, пожалуйста, отправьте это как новый ответ, этот 6-летний ответ становится все более устаревшим. – Cheekysoft 2014-09-25 13:22:26

14

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

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

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

2

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

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

6

Если ваш сервер 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: Указывает ли какой-либо сеанс отслеживания куки, созданных это веб-приложение будет помечено как HttpOnly

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

Пожалуйста, обратитесь к how to set httponly and session cookie for java web appliaction

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(); 
     } 
    } 
} 
Смежные вопросы