1

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

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

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

String ip = request.getHeader("X-FORWARDED-FOR");
if(ip == null) {
    ip = request.getRemoteAddr();
}

我在这方面有点绿,但我认为这种方法可能存在安全漏洞。例如,如果用户在公共 wifi 网络上访问应用程序(在咖啡店、机场、酒店......无论如何),它将存储公共 ip 并将他们的帐户与该 ip 匹配。除非他们特别记得注销,否则任何以同一个 IP 进入他们身后的人都可以完全访问他们的帐户。我该如何防止这种情况?除了匹配ip之外,当cookie被阻止时,我并不完全反对使用另一种方法。我只是不确定除了在 cookie 不可用时完全禁止用户登录之外,他们还有什么其他方法。这是唯一真正安全的方法吗?

更新

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

4

2 回答 2

4

...但我认为这种方法可能存在安全漏洞。例如,如果用户在公共 wifi 网络上访问应用程序(在咖啡店、机场、酒店......无论什么)......

不仅如此。家里有无线宽带的人似乎都来自同一个 IP,所以如果住在一起的两个人都想同时使用你的网站(也许有人推荐给另一个人),他们就会发生冲突。

如果您不能使用 cookie,您可以使用旧的 J2EE 技术,将会话 ID 放在每个 URL 中。如果您已经在使用 J2EE,则可以使用它对 this(和 such)的内置支持HttpServletResponse#encodeURL,这将;jsessionid=token在 URL 上使用。如果您不是,使用查询字符串参数来实现该技术就足够简单了。

于 2013-11-02T15:03:31.387 回答
2

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

  • HttpServletResponse.encodeRedirectURL()重定向时总是使用
  • HttpServletResponse.encodeURL()在生成 URL 时始终使用(用于链接、图像或其他)

请注意,JSTL 会为您<c:url>调用encodeURL()

于 2013-11-02T15:05:09.037 回答