会话cookie 中缺少 HttpOnly 属性安全漏洞原理和解决方案

0. 背景

公司的项目被测出漏洞,提示“会话cookie 中缺少 HttpOnly 属性 可能会窃取或操纵客户会话和 cookie,它们可能用于模仿合法用户,从而使黑客能够以该用户身份查看或变更用户记录以及执行事务” 


其实解决方法很简单 HttpOnly 设置为true 就OK了,但是我们需要了解原理,知其然,知其所以然


0. 什么是HttpOnly

HttpOnly 是一种 cookie 属性,它的作用是防止客户端的脚本语言(如JavaScript)访问和操作 cookie。当一个 cookie 的 HttpOnly 属性被设置为 true 时,客户端脚本无法通过 document.cookie 或其他方法读取或修改该 cookie。

1. HttpOnly 属性的作用 

1. 防止跨站脚本攻击(XSS)

XSS 攻击是一种常见的网络攻击,黑客通过注入恶意脚本来窃取用户 cookie,获取用户敏感信息。将 cookie 设置为 HttpOnly 可以阻止这种攻击,因为恶意脚本无法访问或修改包含敏感信息的 cookie。

2. 增加会话安全性

由于会话 cookie 经常用于管理用户的登录状态和身份验证,将其设置为 HttpOnly 可以增加会话的安全性。黑客无法在用户的浏览器中获取会话 cookie 的值,进而无法伪造用户身份。

3. 减少信息泄露风险

将 cookie 设置为 HttpOnly 可以减少敏感信息泄露的风险。即使恶意脚本成功注入网页,它也无法获取存储在 cookie 中的敏感数据。

 

2. cookie 属性 常见的设置

1. Secure:该属性指定是否只能通过安全的 HTTPS 连接来传输 cookie。当设置为 true 时,只有在 HTTPS 连接下才会传输该 cookie。这样可以增加 cookie 的安全性,防止敏感信息在传输过程中被拦截。

2. HttpOnly:该属性用于防止客户端脚本(如JavaScript)访问和操作 cookie。当设置为 true 时,脚本无法通过 document.cookie 或其他方法读取或修改该 cookie。这可以防止跨站脚本攻击(XSS)和增加会话安全性。

3. Domain:该属性指定 cookie 可以被发送到哪个域名下的服务器。默认情况下,cookie 是针对当前网页的域名有效的。如果需要在多个子域名之间共享 cookie,可以设置 Domain 属性为主域名,使其在整个域名下有效。

4. Path:该属性指定 cookie 可以被发送到哪个路径下的服务器。默认情况下,cookie 是针对当前路径有效的。如果需要在特定路径下共享 cookie,可以设置 Path 属性为该路径。

5. Expires/Max-Age:这两个属性用于设置 cookie 的过期时间。Expires 属性指定一个具体的过期时间,而 Max-Age 属性指定一个相对的过期时间(以秒为单位)。当过期时间到达后,浏览器将删除该 cookie。

6. SameSite:该属性指定了跨站点请求时是否发送 cookie。可以设置为 "Strict",表示只有在同一站点请求时才会发送 cookie;或者设置为 "Lax",表示在同一站点请求和一些导航请求(如点击链接或预加载资源)时会发送 cookie。

 

3. HttpOnly 属性安全解决方案

解决方法1

 Cookie[] cookies = ((HttpServletRequest)request).getCookies();
 if(cookies!=null)
 {
 for(Cookie cookie : cookies){
 //tomcat7 支持该属性,tomcat6 不支持
 cookie.setHttpOnly(true);
 }

我们的tomcat6上这种方法不支持,只好使用以下方法2

解决方法2

if(cookies!=null){
    for(Cookie cookie : cookies){
     //tomcat7 支持该属性,tomcat6 不支持
     String value = cookie.getValue();  
              StringBuilder builder = new StringBuilder();  
              builder.append("JSESSIONID=" + value + "; ");  
              builder.append("Secure; ");  
              builder.append("HttpOnly; ");  
              Calendar cal = Calendar.getInstance();  
              cal.add(Calendar.HOUR, 1);  
              Date date = cal.getTime();  
              Locale locale = Locale.CHINA;  
              SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss",locale); 
              builder.append("Expires=" + sdf.format(date));  
              resp.setHeader("Set-Cookie", builder.toString()); 
    }

 解决方法3 

Spring 框架设置 cookie.setHttpOnly(true);

 可以使用Spring的`javax.servlet.http.CookieGenerator`类来处理cookie。`CookieGenerator`类提供了更方便的方法来创建和处理cookie。以下是使用`CookieGenerator`类来设置HttpOnly属性的示通过调用`cookieGenerator`对象的方法,可以设置cookie的属性,包括HttpOnly属性。请注意,需要将`javax.servlet.http.HttpServletResponse`对象注入到`cookieGenerator`对象中,以便将cookie添加到响应中。
 

@Autowired
private CookieGenerator cookieGenerator;

public void setCookie() {
    cookieGenerator.addCookie("name", "value");
    cookieGenerator.setCookieHttpOnly(true);
    cookieGenerator.setCookieMaxAge(3600);
    cookieGenerator.setCookiePath("/");
}


 

 


 
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

冰点.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值