Как вы настраиваете файлы cookie HttpOnly в tomcat / java webapps?
Вопрос
Прочитав сообщение Джеффа в блоге о Защита Ваших файлов cookie:HttpOnly.Я бы хотел внедрить файлы cookie HttpOnly в моем веб-приложении.
Как вы указываете tomcat использовать файлы cookie только http для сеансов?
Решение
HttpOnly поддерживается начиная с Tomcat 6.0.19 и Tomcat 5.5.28.
Смотрите на Журнал изменений запись об ошибке 44382.
Последний комментарий к ошибке 44382 заявляет: "это было применено к 5.5.x и будет включено в 5.5.28 и далее". Однако, не похоже, что 5.5.28 был выпущен.
Функциональность HttpOnly может быть включена для всех веб-приложений в conf/context.xml:
<Context useHttpOnly="true">
...
</Context>
Моя интерпретация заключается в том, что это также работает для индивидуального контекста, устанавливая его на желаемый Контекст запись в conf/server.xml (таким же образом, как указано выше).
Другие советы
Обновить:Данные 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 к файлу cookie JSESSIONID, то вам нужно будет расширить этот код, чтобы установить все файлы cookie в фильтре.Это не самое лучшее решение в случае использования нескольких файлов cookie, но, возможно, является приемлемым быстрым решением для настройки только для JSESSIONID.
Пожалуйста, обратите внимание, что по мере развития вашего кода с течением времени вас поджидает неприятная скрытая ошибка, когда вы забываете об этом фильтре и пытаетесь установить другой файл cookie в другом месте вашего кода.Конечно, это не будет установлено.
Хотя это действительно взлом.Если вы используете Tomcat и можете его скомпилировать, то взгляните на отличное предложение Шабаза по исправлению поддержки HttpOnly в Tomcat.
Пожалуйста, будьте осторожны, чтобы не перезаписать флаг 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);
}
}
Что касается сессионных файлов cookie, то, похоже, они пока не поддерживаются в Tomcat.Смотрите отчет об ошибке Необходимо добавить поддержку параметра cookie сеанса HttpOnly.На данный момент можно найти несколько сложный обходной путь здесь, что в основном сводится к ручному исправлению Tomcat.На данный момент я действительно не могу найти простой способ сделать это, на данный момент я напуган.
Подводя итог обходному пути, можно сказать, что он включает в себя загрузку версии 5.5 Источник, а затем измените источник в следующих местах:
org.apache.catalina.коннектор.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);
}
Если ваш веб-сервер поддерживает спецификацию 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
также следует отметить, что включение HttpOnly приведет к прерыванию работы апплетов, которым требуется доступ с отслеживанием состояния обратно к jvm.
http-запросы апплета не будут использовать файл cookie jsessionid и могут быть назначены другому tomcat.
Для файлов cookie, которые я явно настраиваю, я переключился на использование Простое печенье предоставлено Апач Широ.Он не наследуется от javax.servlet.http.Cookie, поэтому требуется немного больше манипуляций, чтобы заставить все работать правильно, однако он предоставляет набор свойств HttpOnly и работает с Servlet 2.5.
Для установки файла cookie в ответе, а не для выполнения response.addCookie(cookie)
вам нужно сделать cookie.saveTo(request, response)
.
В 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();
}
}
}
Я нашел в OWASP ( ОВАСП )
<session-config>
<cookie-config>
<http-only>true</http-only>
</cookie-config>
</session-config>
это также исправление проблемы безопасности "httponlycookies in config"