【发布时间】: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