Java 使用客户端IP的会话状态

Java 使用客户端IP的会话状态,java,session,ip-address,Java,Session,Ip Address,我试图使用建议的方法来确定是否存在安全漏洞,该方法在客户端阻止cookie时维护会话状态 通常,我会在客户端cookies中存储UUID,如果UUID与数据库中存储的内容匹配,我会自动登录。但是,如果客户端的cookie被阻止,我就无法访问他们机器上的UUID,因此必须解决使用他们的IP地址并以这种方式与数据库匹配的问题 我使用以下方法确定IP地址: String ip = request.getHeader("X-FORWARDED-FOR"); if(ip == null) { ip

我试图使用建议的方法来确定是否存在安全漏洞,该方法在客户端阻止cookie时维护会话状态

通常,我会在客户端cookies中存储UUID,如果UUID与数据库中存储的内容匹配,我会自动登录。但是,如果客户端的cookie被阻止,我就无法访问他们机器上的UUID,因此必须解决使用他们的IP地址并以这种方式与数据库匹配的问题

我使用以下方法确定IP地址:

String ip = request.getHeader("X-FORWARDED-FOR");
if(ip == null) {
    ip = request.getRemoteAddr();
}
我在这方面有点生疏,但我认为这种方法可能存在安全缺陷。例如,如果用户在公共wifi网络(咖啡店、机场、酒店等)上访问应用程序,它将存储公共ip并将其帐户与该ip匹配。任何在同一ip上跟在他们后面的人都可以完全访问他们的帐户,除非他们特别记得注销。我如何防止这种情况?我并不完全反对在cookie被阻止时使用另一种方法,除了与ip匹配之外。我只是不知道他们除了完全不允许用户在cookies不可用的情况下登录之外还有什么其他方法。这是唯一真正安全的方法吗

更新

根据T.J.Crowders的评论,最近的统计数据显示,2%的用户实际阻止了cookie。我之所以选择依赖cookie有很多原因,并在由于cookie被阻止而无法管理会话状态时显示警告

…但我认为这种方法可能存在安全缺陷。例如,如果用户在公共wifi网络上访问应用程序(在咖啡馆、机场、酒店等任何地方)

不仅如此。在家中使用无线宽带的人似乎都来自同一IP,因此,如果两个住在一起的人都想同时使用你的网站(可能是一个向另一个推荐),他们会发生冲突

如果不能使用cookies,可以使用旧的J2EE技术将会话ID放入每个URL中。如果您已经在使用J2EE,那么您可以使用它的内置支持来实现这一点,这将使用
;URL上的jsessionid=token
。如果没有,那么使用查询字符串参数实现该技术就足够简单了

…但我认为这种方法可能存在安全缺陷。例如,如果用户在公共wifi网络上访问应用程序(在咖啡馆、机场、酒店等任何地方)

不仅如此。在家中使用无线宽带的人似乎都来自同一IP,因此,如果两个住在一起的人都想同时使用你的网站(可能是一个向另一个推荐),他们会发生冲突


如果不能使用cookies,可以使用旧的J2EE技术将会话ID放入每个URL中。如果您已经在使用J2EE,那么您可以使用它的内置支持来实现这一点,这将使用
;URL上的jsessionid=token
。如果没有,那么使用查询字符串参数实现该技术就足够简单了。

servlet API允许在没有Cookie的情况下跟踪会话,使用URL重写(在给定会话中指向应用程序的每个URL都将包含会话ID)。如果您遵守以下几条规则,这是自动的:

  • 重定向时始终使用
    HttpServletResponse.encodeRedirectURL()
  • 生成URL(用于链接、图像或任何内容)时,始终使用
    HttpServletResponse.encodeURL()

请注意,JSTL的
为您调用
encodeURL()

servlet API允许使用URL重写跟踪没有Cookie的会话(在给定会话中指向应用程序的每个URL都将包含会话ID)。如果您遵守以下几条规则,这是自动的:

  • 重定向时始终使用
    HttpServletResponse.encodeRedirectURL()
  • 生成URL(用于链接、图像或任何内容)时,始终使用
    HttpServletResponse.encodeURL()

请注意,JSTL的
为您调用
encodeURL()

使用querystring方法是否会导致书签、通过电子邮件向朋友发送URL等问题?@ryandlf:是的,确实会导致问题。但这几乎是跟踪没有cookie会话的唯一方法。你真的有用户阻止cookies吗?足够关心他们了吗?@ryandlf:是的,是这样的,至少你会发现人们的书签中有会话ID。您可以缓解这种情况:确保忽略(优雅地处理)不存在的会话令牌。并将会话的IP存储在服务器端会话状态,然后如果请求来自不同的IP(即使令牌用于有效会话),则忽略令牌,再次优雅地处理它。这并不困难。只要在模板中一致地使用
(或任何其他类似的标记),并确保重定向时调用了encodeRedirectURL(所有MVC框架也会为您这样做)。没什么大不了的。@ryandlf:问题可以归结为一个经济问题:需要使用cookie并冒失去一些用户的风险,或者在URL编码上投入一些时间。第二种解决方案可能最终是有益的,因为如果你的应用程序中有这么多生成URL的方法,那么一定是出了问题,你最好修复它。使用querystring方法是否会导致书签、通过电子邮件向朋友发送URL等问题?@ryandlf:是的,确实会导致问题。但这几乎是跟踪没有cookie会话的唯一方法。你真的有用户阻止cookies吗?足够关心他们了吗?@ryandlf:是的,是这样的,至少你会发现人们的书签中有会话ID。您可以缓解这种情况:确保忽略(优雅地处理)不存在的会话令牌。并将会话的IP存储在服务器端会话状态中,如果请求来自不同的IP(e),则忽略令牌