1

在我当前的 Play 2 应用程序中,登录会话在 5 分钟后超时。当用户随后单击应用程序中的任何链接时,他们将被重定向到登录页面。成功验证后,它们将被重定向到主页。

我已经实现了一个系统,用户在被重定向到登录页面之前被重定向到他们试图到达的页面。

系统是这样工作的:当会话过期的用户点击一个内部链接时,Deadbolt 确定他们没有登录并将他们重定向到登录页面。在重定向之前,它从请求头中获取目标 url 并将其存储在会话中。用户在下一页填写登录表单后,将详细信息提交给身份验证操作。如果身份验证成功,则该操作检查会话中是否存在目标 url;如果是,它会从会话中清除该项目并重定向到目标 url,如果不是,它会重定向到主页。

目标 url 在持续时间内以字符串形式存在,并被输入到play.mvc.Results.redirect( String url )方法中。

我想知道这是否会为我的应用程序打开任何潜在的攻击媒介?

4

1 回答 1

2

当您将 URL 存储在会话中时,这应该是安全的,因为 URL 必须首先有效才能访问您的应用程序。

但是,用户可能有一种可能的方式导致无效的 URL 存储在您的会话中并将用户重定向到那里,但它必须来自同一台计算机,或者攻击者必须有一种机制来在另一台计算机上固定会话:

  1. 攻击者设置一个主机文件条目以将 www.evil.com 指向您的网站。
  2. 攻击者使用 www.evil.com 域名和他们自己的凭据登录您的网站。
  3. 攻击者等待会话过期。
  4. 攻击者单击内部链接导致 URLhttp://www.evil.com/link存储在您的会话变量中。
  5. 攻击者注销并删除主机条目。
  6. 另一个用户使用相同的会话登录,用户被重定向到 rouge 链接。

如果用户在同一台​​计算机上登录,则攻击者必须将 cookie 域从 编辑www.evil.comwww.yourwebsite.com。如果在另一台计算机上,那么攻击者将不得不以某种方式修复会话(您的站点中可能存在另一个漏洞,例如具有可预测的令牌,表明会话 ID 在任何时候都以明文形式传递)。

如何锁定您的应用程序:

  1. 确保您的网站仅绑定到www.yourwebsite.com- 这将阻止指向同一 IP 的主机文件条目访问您的网站。
  2. 在存储 URL 之前对其进行验证 - 拒绝任何指向应用程序未知域名的绝对 URL,或仅存储相对部分(确保此代码不易受到任何可以输入地址栏中的字符串操作的影响,并且仍然可以命中您的应用程序 - 例如,如果用户将 URL 附加到查询字符串或输入任何其他意外输入)。
  3. 将重定向 URL 存储在查询字符串中,并在登录/注销时使会话无效,以防止会话固定。这次它应该在重定向点进行验证,因为它现在是一个客户端变量 - 您应该确保它重定向到您期望的域名,或者它绝对是一个相对 URL。
  4. 为会话 ID使用安全 cookie以确保它不通过 HTTP 传输。
于 2013-10-04T14:42:26.113 回答