检测用户登录后是否来自其他网站

时间:2015-07-08 09:19:50

标签: java spring security spring-mvc

我正在开发一个spring mvc web应用程序,用户必须登录才能访问某些机密数据。 到目前为止,一切都已完成,但我一度陷入困境。

考虑以下情况:
现在发生的事情:用户已登录并已重定向到主页。现在,用户点击地址栏并输入 www.stackoverflow.com ,一旦打开SO,用户点击浏览器的返回按钮,因为用户的会话处于活动状态,因此允许访问所有数据。
应该发生什么:当登录用户进入另一个网站然后返回时,必须再次登录。

  1. 我在处理浏览器历史记录时做了一些研发,但浏览器不允许您使用历史记录。
  2. 我试过在Interceptor中处理它。
  3. 我尝试过使用HTTP REFERRER,但它没有告诉我User是否从其他网站回来,因为浏览器使用的用户在成功登录后重定向时使用了相同的请求,因此Referrer总是返回我上下文/登录,当用户从其他网站返回时作为引荐来源。

  4. 现在,我没有想法,请指导我实现这一目标 感谢。

    这种奇怪要求的目的
    好用户可以做任何他想做的事情,我想要做的是确保如果用户忘记注销并以某种方式移动到同一个标签内的另一个网站,那么他的数据必须足够安全,以便没有人可以看到除外自己

2 个答案:

答案 0 :(得分:1)

考虑到浏览器的后退按钮与执行正常请求没有任何不同,完全无法做到这一点。

以非常不可靠和过于复杂的方式实现这一点的唯一可行的方法是向每个页面添加一些javascript,并在离开页面时检查页面是否是银行页面之一或外部页面。然后执行一些注销(或将一些令牌存储到本地存储或类似,以指示用户已经在其他地方)。

或者更好的想法是与银行人员交谈并讨论实际威胁,然后确保系统能够承受OWASP攻击。

您是否有安全顾问或类似负责人?你的情况听起来不太安全,考虑到金融行业的监管程度如何(至少在我认识的大多数国家),我很惊讶你可以这样工作。

答案 1 :(得分:1)

选项包括:

Keepalive AJAX

您的网站可以发出AJAX请求以保持非常短的会话超时。例如,会话超时可能是10秒,您的AJAX请求可能每5秒触发一次。这些值必须足够长,以便以最慢的连接来处理用户。

然后,如果用户导航到其他站点,会话将超时,因为没有进行任何AJAX请求以使会话保持活动状态。

为了最好地工作,请设置以下响应标头以禁用缓存:

Cache-Control: private, no-cache, no-store, max-age=0, no-transform
Pragma: no-cache
Expires: 0

将导航更改为POST

这是一项很重要的工作,最好从头开始设计网站。

不是将会话状态保存在cookie中,而是使用表单POST进行所有站点操作,包括导航:

<form method="post" action="/doAction">
  <input type="hidden" name="action" value="navigate" />
  <input type="hidden" name="params" value="page=aboutUs" />
  <input type="hidden" name="token" value="123456789" />
</form>

正如您所看到的,表单数据中有一个标记。提交表单以导航到另一个页面后,该标记值将在服务器端失效,因此无法重复使用。然后,如果用户点击回来,浏览器将询问他们是否要重新提交他们的POST数据。即使他们这样做,因为您已经使服务器上的随机单一使用令牌无效,他们也不会被识别为已登录,您可以将它们重定向到登录页面以启动另一个会话。

令牌是一个会话标识符,但每个页面加载都会刷新标识符并使​​旧标识符无效。