Gentlemen,

I'd like to make a suggestion to add HTTPOnly support to Tomcat 5.5 (for starters). This is a significant security enhancement that will assist in preventing XSS attacks. http://msdn2.microsoft.com/en-us/library/ms533046.aspx

Since the javax core is a "sacred" portion of the codebase, I'd like to get your feedback on my solution proposal. It involves changes to the org.apache.catalina.connector.Request.java, org.apache.catalina.connector.Response.java and org.apache.tomcat.util.http.ServerCookie.java.

org.apache.catalina.connector.Request.java includes the following code to set the JSESSIONID. addCookieInternal is where the cookie magic happens.

// Creating a new session cookie based on that session
       if ((session != null) && (getContext() != null)
              && getContext().getCookies()) {
           Cookie cookie = new Cookie(Globals.SESSION_COOKIE_NAME,
                                      session.getIdInternal());
           configureSessionCookie(cookie);
          * response.addCookieInternal(cookie);*
       }

Next we would need to modify the functionality of response.addCookieInternal in some way from org.apache.catalina.connector.Response.java. These are my suggested backward-compatible changes:

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


Any thoughts would be greatly appreciated.

- Jim

Reply via email to