在共享数据库中安全地将登录令牌从一个网站传递到另一个网站

时间:2016-10-06 15:35:45

标签: security https single-sign-on token

我在不同的服务器上有两个网站,我需要允许从一个站点到另一个站点进行单点登录。两个网站都可以访问同一个数据库。用户已经在网站A上进行了身份验证和信任,但我希望他们点击链接并自动登录并重定向到网站B.我已经查看了SAML和其他SSO选项,但因为这两个网站都可以访问在同一个数据库中,我想知道我是否可以使用简单的令牌来允许SSO?

设置为:

www.websiteA.com > databaseA

www.websiteB.com > databaseA

我正在思考以下几点:

  • www.websiteA.com/sso.php
    • 在与该用户关联的databaseA中创建随机令牌记录,让我们说ABCD1234
  • 重定向到www.websiteB.com/login.php?token=ABCD1234
    • 检查该令牌的databaseA,并在
    • 中记录关联的用户

这是在这两个网站之间执行单点登录的安全方式吗?如果URL变量是通过HTTPS执行的,并且令牌仅在使用后被销毁,那么它是否是安全的?

1 个答案:

答案 0 :(得分:0)

在网站A上生成令牌并将其作为身份验证手段传递到站点B的一般想法在许多情况下我认为是可以接受的。它没有根本性的缺陷,正如您所提到的,最佳做法是以标准方式执行,例如OAuth2(OpenID Connect for identity)。

然而,与往常一样,细节很重要。

令牌需要安全生成(基于加密安全的随机生成器),需要有足够的熵(足够长),需要安全传输,安全地存储在客户端上(如果有的话,但它永远都会存储在内存中至少),接收端的验证不应该容易受到竞争条件的影响(攻击者和受害者同时发送令牌,服务器上的两个线程都检查令牌是否有效,都发现它是,然后两者都无效,但这并不重要,令牌对他们两个都有效)等等。

在您的问题中,安全性方面唯一真正的弱点,我认为使您提出的解决方案直接受到攻击的是在URL中传递令牌。 HTTPS确实可以防止窃听攻击者,但是url参数可能会记录在中间代理上(例如,公司用户可能甚至不知道这样的代理,并且那些终止SSL很多次,利用公司证书在客户端上受信任),它可能会在客户端浏览器中被记住,可能会在目标服务器上登录等。如果令牌只在第一次使用之前有效,那么可以稍微降低风险,但最好将其发送到请求正文(POST)而不是url参数。