2015-12-28 4 views
0

Я хочу добавить флагов httponly и secure для Cookies. Чтобы реализовать его, я использую Filters, которые настроены в web.xml.добавление httponly и безопасного флага для набора файлов cookie в Java-приложении

Код для добавления флагов, как показано ниже:

package com.crisil.dbconn; 

import java.io.IOException; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.FilterConfig; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRequest; 
import javax.servlet.ServletResponse; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

import org.apache.struts2.ServletActionContext; 
import org.owasp.esapi.ESAPI; 
import org.owasp.esapi.filters.SecurityWrapperResponse; 

public class ClickjackFilter implements Filter 
{ 

    private String mode = "DENY"; 

    /** 
    * Add X-FRAME-OPTIONS response header to tell IE8 (and any other browsers who 
    * decide to implement) not to display this content in a frame. For details, please 
    * refer to http://blogs.msdn.com/sdl/archive/2009/02/05/clickjacking-defense-in-ie8.aspx. 
    */ 
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { 
     HttpServletResponse res = (HttpServletResponse)response; 
     //HttpServletRequest req = (HttpServletRequest)request.getSession(); 


     res.addHeader("X-FRAME-OPTIONS", mode); 
     res.addHeader("X-Content-Type-OPTIONS", "nosniff"); 
     res.addHeader("X-XSS-Protection", "1; mode=block"); 
     res.addHeader("Vary", "*"); 
     res.addHeader("Expires", "-1"); 
     res.addHeader("Pragma", "no-cache"); 
     res.addHeader("Cache-control", "no-cache, no-store,max-age=0, must-revalidate"); 
     String contextPath = ((HttpServletRequest) request).getContextPath()+"kevalcccc"; 
     ((HttpServletResponse)ServletActionContext.getResponse()).setHeader("SET-COOKIE", "JSESSIONID=" + ((HttpServletRequest)request).getSession().getId() + ";Path="+contextPath+";Secure;HttpOnly"); 
    // touch the session 
     // ((HttpServletRequest) request).getSessison(); 
     // System.out.println("zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz"); 

     // overwriting the cookie with Secure attribute set 
     // ((HttpServletResponse)response).setHeader("Set-Cookie", "JSESSIONID=" + ((HttpServletRequest)request).getSession().getId() + ";Path=/"); 

     //////////// 

     /* Cookie[] cookies = ((HttpServletRequest) request).getCookies(); 
     if (cookies != null) 
      for (int i = 0; i < cookies.length; i++) { 
       cookies[i].setValue(""); 
       cookies[i].setPath("/"); 
       cookies[i].setMaxAge(0); 
       cookies[i].setSecure(true); 
       res.addCookie(cookies[i]); 
      } 
     */ 
     ////////////// 
     String sessionid = ((HttpServletRequest) request).getSession().getId(); 
     ((HttpServletResponse) response).setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly"); 

     chain.doFilter(request, response); 
    } 

    public void destroy() { 
    } 

    public void init(FilterConfig filterConfig) { 
     String configMode = filterConfig.getInitParameter("mode"); 
     if (configMode != null) { 
      mode = configMode; 
     } 
    } 

} 

Приведенный выше код добавляет httponly и secure флаги для печенья JSESSIONID. Однако в заголовке ответа я получаю два файла cookie. Во втором нет httponly и secure установленных флагов. Пожалуйста, обратитесь к следующей продукции:!

JSESSIONID = 1dbLWQ6WYBHJ93Tv7TfQ2fdLgjRp2pQBsVxQVZ2WBQkYwB60wg43 1248935162 1451244054765; HttpOnly; Безопасный

JSESSIONID = 1dbLWQ6WYBHJ93Tv7TfQ2fdLgjRp2pQBsVxQVZ2WBQkYwB60wg43 1248935162!; путь = /»

Почему httponly и secure флаги не добавлены во второй куки?

+0

Что такое ваш веб-сервер? –

ответ

0

Установка JSESSIONID несет ответственность за то, что контейнер сервлетов работает веб-приложения. Удалите setHeader из вашего фильтр и настроить веб-приложение правильно, добавив следующие строки в web.xml:

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

Я ранее пробовал решение. но версия web.xml - 2.4, которая не поддерживает , из-за которой я использовал фильтр для этой цели. Любое другое решение. – keval

+0

Посмотрите в документах вашего контейнера сервлета, как его можно настроить. Если он не может, возможно, пришло время обновить ... Servlet 2.4 уже похож на 12 лет. – heenenee