在Google App Engine中设置会话cookie上的httpOnly和安全标志

vis*_*esh 4 google-app-engine servlets session-cookies

我需要在Google App Engine中的会话cookie上设置httpOnly和安全标志.

我尝试了以下内容web.xml:

<session-config>
 <cookie-config>
  <http-only>true</http-only>
 </cookie-config>
</session-config>
Run Code Online (Sandbox Code Playgroud)

但是,这不起作用.

我也在每个JSP的顶部尝试过这个:

String sessionid = request.getSession().getId();
response.setHeader("SET-COOKIE", "JSESSIONID=" + sessionid + "; HttpOnly");
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

bat*_*tzi 6

我在使用Google App Engine时遇到了同样的问题,但我想Secure为所有Cookie 添加属性.以下显示了我如何Secure为所有cookie 添加属性.我几乎可以肯定,这种解决方案会为你工作只是通过替换SecureHttpOnly.

我已经实现了一个安全过滤器并映射到我想要设置Secure属性的页面.

<filter>
    <filter-name>Security Filter</filter-name>
    <filter-class>common.SecurityFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>Security Filter</filter-name>
    <url-pattern>*.jsf</url-pattern>
</filter-mapping>
Run Code Online (Sandbox Code Playgroud)

我的第一次尝试是将响应包装到我的自定义中HttpServletResponseWrapper.一切都很好,除了会话cookie没有得到属性.我调试了一下,发现会话cookie没有使用我预期的机制添加.然后我注意到,在您触摸会话后,会话cookie被神奇地添加到响应头中,例如,标题现在包含行,Set-Cookie: JSESSIONID=abcdef;Path=/但cookie未使用我创建的包装器对象添加.我已经发现,在我触及会话后,我可以使用我想要的属性设置我想要的cookie.所以解决方法很简单.

public class SecurityFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // wrap the response
        response = new SecureCookieSetter((HttpServletResponse)response);

        // touch the session
        (HttpServletRequest)request.getSession();

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

public class SecureCookieSetter extends HttpServletResponseWrapper {

    public SecureCookieSetter(HttpServletResponse response) {
        super(response);
    }

    @Override
    public void addCookie(Cookie cookie) {
        cookie.setSecure(true);
        super.addCookie(cookie);
    }

    @Override
    public void addHeader(String name, String value) {
        if ((name.equals("Set-Cookie")) && (!value.matches("(^|.*;)\\s*Secure"))) {
            value = value + ";Secure";
        }
        super.addHeader(name, value);
    }

    @Override
    public void setHeader(String name, String value) {
        if ((name.equals("Set-Cookie")) && (!value.matches("(^|.*;)\\s*Secure"))) {
            value = value + ";Secure";
        }
        super.setHeader(name, value);
    }

}
Run Code Online (Sandbox Code Playgroud)