Cookie http只有spring security和servlet 2.5?

时间:2016-02-16 00:24:34

标签: java spring servlets cookies

我想让我的cookie安全且只有http请求。

我见过许多帖子,如this,似乎工作正常,但使用配置文件和servlet +3。

我基本上想要做的是仅设置我的cookie http和(如果可能的话)ssl。

到目前为止,我已将此添加到我的web.xml

    <session-config>
        <session-timeout>60</session-timeout>
        <cookie-config>
            <http-only>true</http-only>
        </cookie-config>
        <tracking-mode>COOKIE</tracking-mode>
    </session-config>

没有做任何事情,就我读到的而言,我还必须配置我的servlet.xml以启用此功能,但我不知道如何......

知道怎么做吗?

编辑:

由于我使用的是servlet 2.5,xml配置不是一个选项,可能是一个过滤器?

5 个答案:

答案 0 :(得分:4)

我讨厌XML配置,因此我花了一些时间来寻找非XML解决方案。

自Spring Security 1.3起,您可以使用

server.session.cookie.http-only=true
server.session.cookie.secure=true
application.properties 文件中的

也许有一种方法可以使用纯Java配置设置它,但我无法找到它们。

答案 1 :(得分:1)

javagc提到的context.xml更改只会重新配置您的会话cookie。

要更改所有Cookie,您有两种选择:

选项1)更新您的应用程序代码,以使用更安全的方法添加Cookie。示例:https://stackoverflow.com/a/30488471/95674

选项2)您可以配置servlet过滤器以更改通过系统的所有(其他)cookie。将这两个类添加到WAR中的相应包中。然后更新您的web.xml,详情如下。

如果您愿意在OWASP库上添加依赖项,那么在OWASP站点上列出的选项2有一个更简单的示例。它位于此处:https://www.owasp.org/index.php/HttpOnly#Using_Java_to_Set_HttpOnly

响应包装器

这会将包含响应的所有Cookie添加仅http标志。

public class HttpOnlyResponseWrapper extends HttpServletResponseWrapper {

 public HttpOnlyResponseWrapper(HttpServletResponse res) {
   super(res);
 }

 public void addCookie(Cookie cookie) {
   StringBuilder header = new StringBuilder();
   if ((cookie.getName() != null) && (!cookie.getName().equals(""))) {
     header.append(cookie.getName());
   }
   if (cookie.getValue() != null) {
     // Empty values allowed for deleting cookie
     header.append("=" + cookie.getValue());
   }

   if (cookie.getVersion() == 1) {
     header.append(";Version=1");
     if (cookie.getComment() != null) {
       header.append(";Comment=\"" + cookie.getComment() + "\"");
     }
     if (cookie.getMaxAge() > -1) {
       header.append(";Max-Age=" + cookie.getMaxAge());
     }
   } else {
     if (cookie.getMaxAge() > -1) {
       Date now = new Date();
       now.setTime(now.getTime() + (1000L * cookie.getMaxAge()));
       SimpleDateFormat cookieFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss zzz");
       header.append(";Expires=" + cookieFormat.format(now));
     }
   }

   if (cookie.getDomain() != null) {
     header.append(";Domain=" + cookie.getDomain());
   }
   if (cookie.getPath() != null) {
     header.append(";Path=" + cookie.getPath());
   }
   if (cookie.getSecure()) {
     header.append(";Secure");
   }
   header.append(";httpOnly");
   addHeader("Set-Cookie", header.toString());
 }
}

过滤

此Filter在上面的包装器中包装已配置的响应。

package yourpackage;

@WebFilter(filterName = "HttpOnlyFilter", urlPatterns = {"/*"})
public class HttpOnlyFilter implements Filter {
 private FilterConfig config;

 @Override
 public void destroy() {
   this.config = null;
 }

 @Override
 public void doFilter(ServletRequest req, ServletResponse res,
     FilterChain chain) throws IOException, ServletException {

   HttpOnlyResponseWrapper hres = new HttpOnlyResponseWrapper((HttpServletResponse)res);
   chain.doFilter(req, hres);
 }

 public FilterConfig getFilterConfig() {
   return this.config;
 }

 @Override
 public void init(FilterConfig config) throws ServletException {
   this.config = config;
 }
}

从源代码改编(警告:不是完全复制!):http://sylvanvonstuppe.blogspot.com/2007/07/servlet-filter-for-httponly.html

的web.xml

最后一个细节:只有在您的系统中关闭注释扫描时才会这样:

<web-app xmlns="http://java.sun.com/xml/ns/javaee"
         version="2.5" ***metadata-complete="true"***>
</web-app> 

然后,您需要在web.xml文件中手动配置上述过滤器,如下所示:

<filter>
    <filter-name>HttpOnlyFilter
    <filter-class>yourpackage.HttpOnlyFilter
</filter>
<filter-mapping>
    <filter-name>HttpOnlyFilter
    <url-pattern>/*
</filter-mapping>

如果您的应用程序扫描注释(这是默认设置),则不需要web.xml部分。

答案 2 :(得分:1)

我们最近遇到了这个问题。我尝试了仅HTTP的属性设置,该属性设置在本地有效,但是在部署到测试环境时却没有。 env中可能有一些默认设置会覆盖这些本地设置。起作用的是在Spring配置文件中设置属性:

@Bean
public ServletContextInitializer servletContextInitializer() {
    return new ServletContextInitializer() {
        @Override
        public void onStartup(ServletContext servletContext) throws ServletException {
            servletContext.setSessionTrackingModes(Collections.singleton(SessionTrackingMode.COOKIE));
            SessionCookieConfig sessionCookieConfig = servletContext.getSessionCookieConfig();
            sessionCookieConfig.setHttpOnly(true);
            sessionCookieConfig.setSecure(true);
        }
    };
}

答案 3 :(得分:1)

借助 ServletContextListener ,我们可以在Tomcat启动和关闭时控制servlet。因此,在tomcat启动时,我们正在设置httponly的配置。

import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
public final class ContextListener implements ServletContextListener {

    private ServletContext context = null;
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        this.context = null;
    }
    @Override
    public void contextInitialized(ServletContextEvent event) {
        this.context = event.getServletContext();
        this.context.getSessionCookieConfig().setHttpOnly(true);

    }
}

web.xml中的abb beloww条目

<listener>
<description>contextListener</description>
<listener-class>
        main.ContextListener 
    </listener-class>
 </listener>

答案 4 :(得分:-1)

我相信你错过了安全标签。尝试添加:

<secure>false</secure>