← 返回首页
Sensitive cookies without the HttpOnly response header set — CodeQL query help documentation CodeQL docs
CodeQL documentation
CodeQL resources

Sensitive cookies without the HttpOnly response header set

ID: java/sensitive-cookie-not-httponly Kind: path-problem Security severity: 5.0 Severity: warning Precision: high Tags: - security - external/cwe/cwe-1004 Query suites: - java-code-scanning.qls - java-security-extended.qls - java-security-and-quality.qls

Click to see the query in the CodeQL repository

Cookies without the HttpOnly flag set are accessible to client-side scripts (such as JavaScript) running in the same origin. In case of a Cross-Site Scripting (XSS) vulnerability, the cookie can be stolen by a malicious script. If a sensitive cookie does not need to be accessed directly by client-side scripts, the HttpOnly flag should be set.

Recommendation

Use the HttpOnly flag when generating a cookie containing sensitive information to help mitigate the risk of client-side scripts accessing the protected cookie.

Example

The following example shows two ways of generating sensitive cookies. In the ‘BAD’ cases, the HttpOnly flag is not set. In the ‘GOOD’ cases, the HttpOnly flag is set.

class SensitiveCookieNotHttpOnly { // GOOD - Create a sensitive cookie with the `HttpOnly` flag set. public void addCookie(String jwt_token, HttpServletRequest request, HttpServletResponse response) { Cookie jwtCookie =new Cookie("jwt_token", jwt_token); jwtCookie.setPath("/"); jwtCookie.setMaxAge(3600*24*7); jwtCookie.setHttpOnly(true); response.addCookie(jwtCookie); } // BAD - Create a sensitive cookie without the `HttpOnly` flag set. public void addCookie2(String jwt_token, String userId, HttpServletRequest request, HttpServletResponse response) { Cookie jwtCookie =new Cookie("jwt_token", jwt_token); jwtCookie.setPath("/"); jwtCookie.setMaxAge(3600*24*7); response.addCookie(jwtCookie); } // GOOD - Set a sensitive cookie header with the `HttpOnly` flag set. public void addCookie3(String authId, HttpServletRequest request, HttpServletResponse response) { response.addHeader("Set-Cookie", "token=" +authId + ";HttpOnly;Secure"); } // BAD - Set a sensitive cookie header without the `HttpOnly` flag set. public void addCookie4(String authId, HttpServletRequest request, HttpServletResponse response) { response.addHeader("Set-Cookie", "token=" +authId + ";Secure"); } // GOOD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through string concatenation. public void addCookie5(String accessKey, HttpServletRequest request, HttpServletResponse response) { response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true) + ";HttpOnly"); } // BAD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` without the `HttpOnly` flag set. public void addCookie6(String accessKey, HttpServletRequest request, HttpServletResponse response) { response.setHeader("Set-Cookie", new NewCookie("session-access-key", accessKey, "/", null, null, 0, true).toString()); } // GOOD - Set a sensitive cookie header using the class `javax.ws.rs.core.Cookie` with the `HttpOnly` flag set through the constructor. public void addCookie7(String accessKey, HttpServletRequest request, HttpServletResponse response) { NewCookie accessKeyCookie = new NewCookie("session-access-key", accessKey, "/", null, null, 0, true, true); response.setHeader("Set-Cookie", accessKeyCookie.toString()); } }

References