我正在尝试确定在客户端阻止cookie时使用建议的维护会话状态方法是否存在安全漏洞。
通常我将UUID存储在客户端cookie中,如果UUID与数据库中存储的内容匹配,则自动登录。但是,如果客户端阻止了cookie,我就无法访问其计算机上的UUID,因此必须解析使用其IP地址并以此方式与数据库匹配。
我使用以下方法确定IP地址:
String ip = request.getHeader("X-FORWARDED-FOR");
if(ip == null) {
ip = request.getRemoteAddr();
}
我在这方面有点绿,但我认为这种方法可能存在安全漏洞。例如,如果用户访问公共wifi网络上的应用程序(在咖啡店,机场,酒店......等等),它将存储公共IP并将其帐户与该ip匹配。在同一个IP上进入他们后面的任何人都可以完全访问他们的帐户,除非他们特别记得注销。我该如何防止这种情况?除了与ip匹配之外,当cookie被阻止时,我并不完全反对使用另一种方法。我只是不确定他们可能采用的其他方法除了在没有cookie时完全禁止用户登录。这是唯一真正安全的方法吗?
更新
基于T.J.克劳斯评论说,最近的统计数据显示,2%的用户实际上已经阻止了cookie。我选择依赖cookie有很多原因,并且由于cookie被阻止而无法管理会话状态时显示警告。
答案 0 :(得分:4)
...但我认为这种方法可能存在安全漏洞。例如,如果用户在公共wifi网络上访问应用程序(在咖啡店,机场,酒店......等等)...
不仅如此。在家中拥有无线宽带的人似乎都来自同一个IP,所以如果两个住在一起的人都希望同时使用你的网站(也许一个人推荐到另一个),他们就会发生冲突。
如果您不能使用cookie,您可以使用旧的J2EE技术将会话ID放在每个URL中。如果您已经在使用J2EE,则可以使用其内置的支持(HttpServletResponse#encodeURL
等),这将在URL上使用;jsessionid=token
。如果不是,那么使用查询字符串参数实现该技术非常简单。
答案 1 :(得分:2)
servlet API允许使用URL重写跟踪没有cookie的会话(指向给定会话中指向应用程序的每个URL都将包含会话ID)。如果您遵守一些规则,这是自动的:
HttpServletResponse.encodeRedirectURL()
HttpServletResponse.encodeURL()
请注意,JSTL <c:url>
为您拨打encodeURL()
。