2

在测试 Omniauth 并关注广受欢迎的 Ryan Bates 的视频时,我认为存在一个重大的安全漏洞。这是一个例子

我有两个用户:Aurelien 和 John

早上约翰登录推特但忘记注销。然后他继续 myapplication 并通过http://myapplication.com/auth/twitter连接到 Twitter 服务。他被自动分配到 Twitter 身份验证,因为 Twitter 记得 John 已登录。John 开始工作。

与此同时,他的兄弟 Aurelien 在同一台计算机上使用 myapplication。他决定他希望从 myapplication 发布一条推文并继续访问http://myapplication.com/auth/twitter以通过 OmniAuth 登录到他的 Twitter 帐户。多么惊喜!他不需要登录,但是当重定向到回调 URL 时,他发现他当前以 John 的身份登录!

现在我想相信大多数用户不共享他们的电脑/桌子/电话,但我确信这是一个经常出现的问题。

您可以遵循什么策略或逻辑来防止这种情况发生?

例如,当需要来自 myapplication 的其他用户登录 Twitter 而不是使用之前打开的 Twitter 会话时,您如何确保?

欢迎举例!

4

1 回答 1

1

幸运的是,有一个名为的Twitter OAuth 选项force_login可以涵盖该风险。您可以通过两种方式使用它:

  1. 将此选项添加到您的 OmniAuth 配置中:

    Rails.application.config.middleware.use OmniAuth::Builder do
      provider :twitter, ENV["TWITTER_KEY"], ENV["TWITTER_SECRET"],
        {
          :authorize_params => {
            :force_login => 'true'
          }
        }
    end
    

    并且每次有人通过 连接到 Twitter 服务时http://myapp.com/auth/twitter,他都会自动退出 Twitter。

  2. 或者,您可以根据具体情况将此选项添加到 URL。例如:

    • http://myapp.com/auth/twitter将正常运行。

    • http://myapp.com/auth/twitter?force_login=true将强制用户退出 Twitter。

顺便说一句,这一切都在omniauth-twitter gem 的 README中。

最后一点:此选项仅适用于omniauth-twitter。其他 OmniAuth 提供商可能有类似的选项,但其他人可能根本没有。例如,Facebook 有一个auth_type选项,当设置为时,reauthenticate将要求用户在尝试登录时输入他的密码。然而,这不会让用户从 Facebook 注销。有时这是你想要的,有时不是。从其他服务中注销用户可能非常麻烦。我实际上希望所有提供商都有这两个选项,以便我们可以选择使用哪一个(从外部服务中注销用户或再次询问密码)但我想我们必须满足于我们的有。例如,据我所知,谷歌对这种风险没有任何保护措施。

于 2013-11-18T13:54:56.497 回答