【问题标题】:How can I beef up this security with cross domain user sessions?如何通过跨域用户会话加强这种安全性?
【发布时间】:2011-01-23 00:37:03
【问题描述】:

我有一个 Mothership 域,如果您登录它,则会在数据库中创建一个令牌,供您使用用户 ID、创建日期时间、到期日期时间和用户代理登录。到期时间设置为令牌生成后一小时(在用户登录时创建)。

为了能够从 Mothership 登录到 Scoutship,我像这样附加了一个查询字符串

<a href="http://www.spaceship.com?user=ahs6588ads6d8das">go to spaceship</a>

然后在侦察机上,它会像这样查找数据库:

$query = "SELECT user_id FROM user_tokens
                    WHERE token = $tokenFromUrl
                        AND user_agent = $thisUserAgent
                        AND expires > NOW()
            LIMIT 1";

如果找到匹配项,则登录用户,然后发送位置标头以删除查询字符串。

显然,如果有人访问了该 URL,它将以任何人的身份登录(前提是他们在登录旧站点的一小时内到达,并且具有相同的用户代理字符串)。这对我来说听起来并不安全。

有没有办法加强这种安全性?我是否应该在数据库中有一个类似has_auto_logged_in 的列并将其设置为 TRUE 以进行第一次查找,然后拒绝所有传入的请求?

非常感谢

更新

这是我想出来的

  • 每个请求都会创建一个有效期为 15 分钟的新随机数并保存用户代理
  • 将随机数哈希添加到查询字符串中的传出 URL
  • 新站点将确保哈希与随机数匹配,并且在 15 分钟内到期并具有相同的用户代理。然后它将删除该随机数。
  • 发送位置标头以删除查询字符串。

所以,唯一可以解决这个问题的方法是,如果 A 人在网站上,而 B 人(黑客)

  • 拥有完全相同的用户代理字符串(或伪造)
  • 观察哈希并在他们自己的浏览器中访问它,但在 15 分钟内且在 A 提出任何新请求之前

除此之外你还能做更多吗?您可能可以使用 AJAX 脚本来获取新的哈希并更新链接,但这是否比它的价值更麻烦?

【问题讨论】:

  • 你是如何生成令牌的?
  • @Micheal 令牌是使用sha1() 结合用户代理、随机和time() 生成的。
  • (你的真实代码可以保护你免受 SQL 注入,对吧?)
  • 是的 - 只是使用这些变量来指示它们的值可能是什么。在上面的示例中也无法判断它们是否是 SQL 注入漏洞,因为我没有显示这些变量的维度。

标签: php mysql security cross-domain kohana


【解决方案1】:

这就是安全性在许多实现中的工作方式。在 url 或 cookie 中有 SID 参数时,您可以看到这些。使这些更安全的唯一方法是使用更大的 id。

【讨论】:

    【解决方案2】:

    尝试随机数。我什至为这样的东西预订了一张桌子

    当用户将被重定向时,根据时间、用户 ID 等创建一个随机散列。通过 URL 发送。当 URL 重定向并尝试在另一端登录用户时,它会检查 nonce 是否在数据库中。如果是,它将用户登录并删除随机数。如果不是,则拒绝用户。

    您甚至可以添加过期时间。

    【讨论】:

    • 好一个。这可以用于每个页面调用(性能下降)吗?
    • 我会放一个缓存。就像,在第一次调用时生成它,然后检查该用户的现有调用,然后每 5 分钟、几小时(无论多长时间)重新生成一次。不过我不会太担心,如果你设计得当,一个简单的插入不会做太多
    • 你甚至可以制作一个中间页面,将链接指向redirect.php?site=scoutship,它会在其中生成随机数并重定向。
    • 感谢您的回答 Chacha102。我已经对我的问题进行了更新,如果您预见到任何问题,请告诉我。干杯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-08
    • 1970-01-01
    • 1970-01-01
    • 2015-11-10
    • 1970-01-01
    • 2011-05-05
    • 1970-01-01
    相关资源
    最近更新 更多